我正在处理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 :(得分: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
输出看起来是什么以及您最终输出应该是什么。