2015-09-22 141 views
0

我正在研究shell腳本並試圖將用戶輸入拆分爲多個變量並在不同的地方使用它們。如何將輸入字符串拆分爲多個變量

用戶輸入不是固定,從而不能真正分配可變的固定號碼,輸入由逗號分隔,

./user_input.ksh -string /m01,/m02,/m03 

#!/bin/ksh 
STR=$2 

function showMounts { 
    echo "$STR" 

    arr=($(tr ',' ' ' <<< "$STR")) 
    printf "%s\n" "$(arr[@]}" 

    for x in "$(arr[@]}" 
    do 
     free_space=`df -h "$x" | grep -v "Avail" | awk '{print $4}'` 
     echo "$x": free_space "$free_space" 
    done 

#total_free_space = <total of $free_space> 
#echo "$total_free_space" 
} 

基本上$ STR *變量值的文件系統的安裝點

主機輸出如果單獨運行df -h命令

$ df -h /m01 | grep -v "Avail" | awk '{print $4}' 

***Output*** 
150 

目前存在的問題:

(working)1. How to get free space available for each /m* using df -h? 
+0

目前尚不清楚你想如何拆分。提供更多的例子來澄清。 – anubhava

+0

@anubhava我以回聲爲例,謝謝。 – homer

+0

df -h/m01 | grep -v「Avail」| awk {'print $ 4'} - >給我150,但是這在腳本 – homer

回答

2

最簡單的辦法就是在這裏用shell數組是這樣的:

#!/bin/ksh 
str='/m01,/m02,/m03' 

arr=($(tr ',' ' ' <<< "$str")) 
printf "%s\n" "${arr[@]}" 

輸出:

/m01 
/m02 
/m03 

要單獨閱讀元素,您可以使用:

"${arr[0]}" 
"${arr[1]}" 
... 

更新:這是您的修正後的腳本:

#!/bin/ksh 
STR="$2" 

arr=($(tr ',' ' ' <<< "$STR")) 
printf "<%s>\n" "${arr[@]}" 

for x in "${arr[@]}"; do 
    echo "$x" 
    free_space=`df -h "$x" | awk '!/Avail/{print $4}'` 
    echo "$free_space" 
done 
+0

它顯示所有的坐騎,你能告訴我如何使用它們中的每一個:1.檢查它是否存在於服務器上('ls -l $ {arr [0]}'),如果不存在則退出和2.可用空間。我直接從主機獲得可用空間,例如'df -h/m01 | grep%awk {'print $ 4'} sed's /%// g'' 3.所有數組變量的可用空間總量。起初我以爲我會知道所有元素會在那裏,但如果它是動態生成的,那麼它將不可能。 – homer

+0

增加了兩個換行空格,但不知何故,它沒有工作。 – homer

+0

按照推薦進行了更正,接收到錯誤1。for/m01錯誤:free_space:未找到[沒有這樣的文件或目錄] 2. for/m02,/ m03錯誤:/ m02,/ m03沒有這樣的文件或目錄點不存在/ m02,/ m03所以試圖退出,如果發生這種情況 – homer

0

你可以試試,

#!/bin/ksh 
STR=/m01,/m02,/m03 
read STR1 STR2 STR3 <<<`echo $STR | awk 'BEGIN{FS=","; OFS=" "}{$1=$1; print}'` 
echo $STR1 - $STR2 - $STR3 

你:

 
/m01 - /m02 - /m03 
0

,主題的變化:

# cat user_input.ksh 

#!/bin/ksh 
c=1 
for i in $(echo ${@} | tr "," " ") 
do 
    eval STR$c="$i" 
    ((c=c+1)) 
done 

printf "\$STR1 = %s; \$STR2 = %s; \$STR3 = %s; ...\n" "$STR1" "$STR2" "$STR3" 

它給你:

# ksh ./user_input.ksh /m01,/m02,/m03,/m04 
$STR1 = /m01; $STR2 = /m02; $STR3 = /m03; ... 

希望幫助..

--ab1

0
$ cat tst.sh 
str='/m01,/m02,/m03' 
IFS=, 
set -- $str 
for i 
do 
    echo "$i" 
done 

$ ./tst.sh 
/m01 
/m02 
/m03 

,除非你要導出它們(由不要使用全大寫的變量名並避免與HOME,PATH,IFS等內置名稱發生衝突)。

對於你的整體的腳本,你應該簡單地做這樣的事情:這取決於你在做什麼你df -h輸出看起來像什麼最後的輸出應該是

df -h "${str//,/ }" | awk '/^ /{print $5, $3; sum+=$3} END{print sum}' 

+1

同意大寫評論,將改變它。謝謝。 – homer

+1

感謝您提供所有明智的建議,如果我聽起來像不遵從指示的人,它確實教會了我腳本的各個方面和SORRY。 :) – homer

相關問題