如何将输入字符串拆分为多个变量
How to split input string into multiple variable
我正在编写 shell 脚本并尝试将用户输入拆分为多个变量并在不同的地方使用它们。
用户输入不固定所以不能真正分配固定数量的变量,输入以逗号分隔,
./user_input.ksh -string /m01,/m02,/m03
#!/bin/ksh
STR=
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 }'`
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 }'
***Output***
150
当前问题:
(working)1. How to get free space available for each /m* using df -h?
你可以试试,
#!/bin/ksh
STR=/m01,/m02,/m03
read STR1 STR2 STR3 <<<`echo $STR | awk 'BEGIN{FS=","; OFS=" "}{=; print}'`
echo $STR1 - $STR2 - $STR3
你得到:
/m01 - /m02 - /m03
主题变体:
# 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
最简单的方法是在这里使用 shell 数组,如下所示:
#!/bin/ksh
str='/m01,/m02,/m03'
arr=($(tr ',' ' ' <<< "$str"))
printf "%s\n" "${arr[@]}"
输出:
/m01
/m02
/m03
要单独读取元素,您可以使用:
"${arr[0]}"
"${arr[1]}"
...
更新:这是您更正的脚本:
#!/bin/ksh
STR=""
arr=($(tr ',' ' ' <<< "$STR"))
printf "<%s>\n" "${arr[@]}"
for x in "${arr[@]}"; do
echo "$x"
free_space=`df -h "$x" | awk '!/Avail/{print }'`
echo "$free_space"
done
$ 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 , ; sum+=} END{print sum}'
取决于您的 df -h
输出结果以及您的最终输出结果。
我正在编写 shell 脚本并尝试将用户输入拆分为多个变量并在不同的地方使用它们。
用户输入不固定所以不能真正分配固定数量的变量,输入以逗号分隔,
./user_input.ksh -string /m01,/m02,/m03
#!/bin/ksh
STR=
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 }'`
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 }'
***Output***
150
当前问题:
(working)1. How to get free space available for each /m* using df -h?
你可以试试,
#!/bin/ksh
STR=/m01,/m02,/m03
read STR1 STR2 STR3 <<<`echo $STR | awk 'BEGIN{FS=","; OFS=" "}{=; print}'`
echo $STR1 - $STR2 - $STR3
你得到:
/m01 - /m02 - /m03
主题变体:
# 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
最简单的方法是在这里使用 shell 数组,如下所示:
#!/bin/ksh
str='/m01,/m02,/m03'
arr=($(tr ',' ' ' <<< "$str"))
printf "%s\n" "${arr[@]}"
输出:
/m01
/m02
/m03
要单独读取元素,您可以使用:
"${arr[0]}"
"${arr[1]}"
...
更新:这是您更正的脚本:
#!/bin/ksh
STR=""
arr=($(tr ',' ' ' <<< "$STR"))
printf "<%s>\n" "${arr[@]}"
for x in "${arr[@]}"; do
echo "$x"
free_space=`df -h "$x" | awk '!/Avail/{print }'`
echo "$free_space"
done
$ 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 , ; sum+=} END{print sum}'
取决于您的 df -h
输出结果以及您的最终输出结果。