cat
我正在根据/输出的输出执行 python 文件awk
。假设我有一个类似的文件
samp.txt
:
test.py test.conf
dev.py dev.conf
现在我有一个小的 shell 脚本,它cat
是samp.txt
文件并触发 Python 脚本。
samp.sh
:
OLDIFS=$IFS; IFS=$'\n';for file in $(cat samp.txt) ;
do
text="$file -c $1 -s $2 -t $3"
out=`python $text`
done
当我运行 shell 脚本时,它说
python: can't open file 'test.py test.conf' : [Errno 2] No such file or directory
问题是因为单引号。需要一些建议来克服它。
答案1
这个问题不是由于任何单引号(我假设您指的是错误输出中显示的单引号;这些只是 Python 显示错误的方式),而是由于您依赖 shell 来拆分$text
在空格上分成单独的单词。同时,您已在IFS
循环之前从变量中删除了空格字符,这意味着 shell 无法正确执行该拆分。
正确的解决方案是不是让 shell$text
在空格上进行分割,因为这仍然会在生成的单词上调用文件名通配符。由于$text
包含$1
,$2
和$3
,这些值也会在$text
分割时按空格等分割。
不要依赖 shell 正确分割变量,而是在循环中$text
读取每一行的两个单词:samp.txt
while
while read -r script config; do
out=$( python "$script" "$config" -c "$1" -s "$2" -t "$3" )
done <samp.txt
如果你想为你的参数使用一个单独的变量,并且如果你使用的是egbash
或另一个具有命名数组的shell:
args=( -c "$1" -s "$2" -t "$3" )
while read -r script config; do
out=$( python "$script" "$config" "${args[@]}" )
done <samp.txt
使用数组而不是文本字符串作为参数可以使参数在数组中正确分隔。的扩展"${args[@]}"
将是该数组的单独元素,每个元素都被正确引用。这意味着例如$1
, $2
and$3
可以包含空格等,没有任何问题。
在 POSIX ( /bin/sh
) 脚本中,假设您可以安全地丢弃位置参数$4
:
set -- -c "$1" -s "$2" -t "$3"
while read -r script config; do
out=$( python "$script" "$config" "$@" )
done <samp.txt