将带有列表/数组的BASH脚本称为参数



是否可以将带有数组/列表的bash脚本称为参数之一?我尝试了下面的示例,但它在"("。

bash file_manipulation.sh source_dir target_dir (filename1 filename2)

这样做:保存前2个参数并将其移出位置参数,然后将剩余的位置参数存储在数组

#!/bin/bash
src=$1
tgt=$2
shift 2
files=( "$@" )
echo "manipulation"
echo " src=$src"
echo " tgt=$tgt"
for ((i=0; i < ${#files[@]}; i++)); do
    echo " file $i: ${files[i]}"
done

so

$ bash file_manipulation.sh source_dir target_dir filename1 filename2
manipulation
 src=source_dir
 tgt=target_dir
 file 0: filename1
 file 1: filename2

您也可以像数组一样使用位置参数:

for file do
    echo file: $file
done

no,您只能将字符串传递到shell脚本(或其他任何其他程序)。

您可以做的是处理一些特殊的语法,以适用于您定义自己并在Shell脚本中手动解析的阵列。例如,您可以将括号用作数组的定界符。然后,您必须逃脱它们,以使它们不会被外壳解释:

bash file_manipulation.sh source_dir target_dir ( filename1 filename2 )
cat file_manipulation.sh 
#!/bin/bash
echo -e "source:n  $1";
echo -e "target:n  $2";
echo "files:";
#Convert a String with spaces to array, before delete parenthesis
my_array=(`echo $3 | sed 's/[()]//g'`)
for val in ${my_array[@]}; do
  echo "  $val";
done
#I add quotes to argument
bash file_manipulation.sh source_dir target_dir "(filename1 filename2)"

您得到:

来源:  source_dir目标:  target_dir文件:  filename1  filename2

注意:没有括号的情况更好

cat file_manipulation.sh 
#!/bin/bash
my_array=( $3 )
for val in ${my_array[@]}; do
  echo "$val";
done
#I add quotes to argument, and without parenthesis
bash file_manipulation.sh source_dir target_dir "filename1 filename2"

注2:文件名不能包含空格。

相关内容

  • 没有找到相关文章