【问题标题】:How to split input string into multiple variable如何将输入字符串拆分为多个变量
【发布时间】:2015-12-19 16:11:22
【问题描述】:

我正在编写 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?

【问题讨论】:

  • 不清楚要如何拆分。再举几个例子来澄清一下。
  • @anubhava 我提供了 echo 作为示例,谢谢。
  • df -h /m01 | grep -v "有效" | awk {'print $4'} --> 给我 150,但这在脚本中不起作用
  • @EdMorton 谢谢,更新了我使用的问题,错误是什么以及我正在尝试解决的问题。
  • @EdMorton arr 是错字,我修正了它。错误日志指向我开始 free_space =... 的行。我的主要目标是 1. 检查用户输入的所有挂载是否存在,如果不存在则退出 2. 在每个挂载处获取可用空间 3. 结合总和 #2 获取总可用空间

标签: arrays shell awk ksh


【解决方案1】:

最简单的方法是在这里使用 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. 检查它是否存在于服务器上(ls -l ${arr[0]}),如果不存在则退出 2 . 可用空间。我直接从主机获得可用空间,例如df -h /m01 | grep % awk {'print $4'} sed 's/%//g' 3。所有数组变量的总可用空间。最初我以为我会知道所有元素会在那里,但如果它是动态生成的,那将是不可能的。
  • 为换行添加了两个空格,但不知何故它不起作用。
  • 已按建议更正,收到几个错误 1. for /m01 error: free_space: not found [No such file or directory] ​​2. for /m02, /m03 error: /m02, /m03 No这样的文件或目录(基本上 /m02、/m03 不存在挂载点,因此如果发生这种情况,请尝试退出。
  • 这里写错字了,编辑了。我认为必须有不同的方式在脚本中使用 df -h。
  • 试试我更新的答案,我试图为您提供更正的脚本。
【解决方案2】:

你可以试试,

#!/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

【讨论】:

    【解决方案3】:

    主题的变体:

    # 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

    【讨论】:

      【解决方案4】:
      $ 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 输出是什么样的以及您的最终输出应该是什么。

      【讨论】:

      • 同意大写注释,将更改它。谢谢。
      • 感谢您提供的所有明智建议,它确实教会了我编写脚本的各个方面,如果我听起来像一个不遵守指示的人,我很抱歉。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2016-02-02
      相关资源
      最近更新 更多