2015-09-22 142 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

相关问题