如何将输入字符串拆分为多个变量

时间:2015-09-22 15:31:17

标签: arrays shell awk ksh

我正在处理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?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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 "${str//,/ }" | awk '/^ /{print $5, $3; sum+=$3} END{print sum}'

取决于您的df -h输出看起来是什么以及您最终输出应该是什么。