根据 cat/awk 输出从 shell 脚本执行 python 文件

根据 cat/awk 输出从 shell 脚本执行 python 文件

cat我正在根据/输出的输出执行 python 文件awk。假设我有一个类似的文件

samp.txt:

test.py test.conf
dev.py dev.conf

现在我有一个小的 shell 脚本,它catsamp.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.txtwhile

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, $2and$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

相关内容