如何读取shell脚本传递的参数总数并将其分配给变量

时间:2017-09-16 06:12:19

标签: bash shell unix scripting

我想运行一个带有一些参数传递的shell脚本,参数的数量将不断变化,我想首先读取传递的参数总数然后读取每个参数并将这些参数存储在变量中“for”或“while”循环的帮助,我正在做如下但没有将参数分配给变量

运行脚本如下 sh My_script.sh ARG1 ARG2 ARG3 ... ARGn

我试着写如下

#!/bin/bash
TOTAL_ARG=$#
NEW_PATH=""
n=1
While [[ $n -le $TOTAL_ARG ]]
do
  CUS_PATH=""
  CUS_PATH="$`echo $n`"
  NEW_PATH="$WORSPACE"/"$CUS_PATH"" "
  echo $NEW_PATH
  n=$((n+1))
done

看起来CUS_PATH =“$ echo $n”行无法执行并产生$ 1 $ 2 $ 3 $ 4 ... $ n

的值

1 个答案:

答案 0 :(得分:0)

回答问题的第一个版本:

所有循环都是不必要的。您的代码可以减少为:

#!/bin/bash
new_path="$*"
echo "new_path is '$new_path'"

例如,在你的参数列表中运行它:

$ bash My_script.sh ARG1 ARG2 ARG3 ... ARGn
new_path is 'ARG1 ARG2 ARG3 ... ARGn'

如果你真的想通过变量n中的数字来访问一个参数(这很少需要):

#!/bin/bash
new_path="$*"
echo "new_path is '$new_path'"
n=3
echo "Argument #$n is '${!n}'"

举个例子:

$ bash My_script.sh ARG1 ARG2 ARG3 ... ARGn
new_path is 'ARG1 ARG2 ARG3 ... ARGn'
Argument #3 is 'ARG3'

回答问题的第二个版本

尝试:

$ cat My_script.sh 
#!/bin/bash
workspace=/abc/def
for x in "$@"
do
    new_path="$new_path $workspace/$x"
done
echo "new_path is '$new_path'"

例如:

$ bash My_script.sh ARG1 ARG2 ARG3 ... ARGn
new_path is ' /abc/def/ARG1 /abc/def/ARG2 /abc/def/ARG3 /abc/def/... /abc/def/ARGn'

<强>可替换地:

$ cat My_script.sh 
#!/bin/bash
workspace=/abc/def
new_path=" $*"
new_path=${new_path// / $workspace/}
echo "new_path is '$new_path'"

$ bash My_script.sh ARG1 ARG2 ARG3 ... ARGn
new_path is ' /abc/def/ARG1 /abc/def/ARG2 /abc/def/ARG3 /abc/def/... /abc/def/ARGn'