我写了以下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
来扩展?
答案 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;
中直接使用通配符。我不会解释那些。