在bash脚本中展开变量以在单引号中传递其值

时间:2016-12-02 09:21:34

标签: linux bash shell

我写了以下shell脚本:

#!/bin/bash

for ff in $(ls *.mkv *.mp4 *.avi); do
    echo Processing $ff
    php -r 'echo ph_dct_videohash("$ff");' 
done

但是我没有预期用php行中的当前值替换$ ff,而是出现错误: PHP Notice: Undefined variable: ff in Command line code on line 1。看起来$ff已经按原样传递但不是它的扩展。如何通过ff而不是$ff来扩展?

3 个答案:

答案 0 :(得分:1)

试试这个:'echo ph_dct_videohash("'$ff'");'

'$ff'字面上是$ff,但"$ff"$ff扩展为变量ff的值。)

更新。一种更正确的方法(对于具有空格的名称):

for ff in *.mkv *.mp4 *.avi; do
    echo "Processing $ff"
    php -r 'echo ph_dct_videohash("'"$ff"'");'
done

'echo ph_dct_videohash("'"$ff"'");'将始终扩展为php的一个参数,并且向PHP代码添加$个字符不会导致额外的shell变量扩展(因为'...')。

答案 1 :(得分:1)

你没有传递变量;您正在尝试动态构造PHP命令,该命令存在各种问题和安全风险。

要将值实际传递给PHP作为参数,请使用类似

的内容
for ff in *.mkv *.mp4 *.avi; do
    echo "Processing $ff"
    php -r 'echo ph_dct_videohash($argv[1]);' "$ff"
done

(我对PHP本身的了解有点缺乏;你需要调整我的PHP代码,但调用php应该是正确的。)

答案 2 :(得分:0)

只需在$ff评估之前撤消引号,然后再恢复它们,如下所示:

php -r 'echo ph_dct_videohash("'$ff'");'

如果文件名包含空格,则不会按原样运行。其他答案已经解决了ls""不使用for"在line-height: 0; outline: none; vertical-align: top;中直接使用通配符。我不会解释那些。