[英]Expand variable in the bash script to pass its value in the single quotes
我寫了以下shell腳本:
#!/bin/bash
for ff in $(ls *.mkv *.mp4 *.avi); do
echo Processing $ff
php -r 'echo ph_dct_videohash("$ff");'
done
但是,而不是$ ff用php
行中的當前值替換$ ff,我得到了錯誤: PHP Notice: Undefined variable: ff in Command line code on line 1
。 看起來$ff
已按原樣傳遞,但未按其擴展傳遞。 如何實現通過ff
而不是$ff
擴展?
試試這個: '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變量擴展(因為'...'
)。
您沒有傳遞變量; 您正在嘗試動態構建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
的調用應該是正確的。)
只需撤銷$ff
評估之前的引號,然后再恢復引號,如下所示:
php -r 'echo ph_dct_videohash("'$ff'");'
如果文件名包含空格,則無法按原樣工作。 其他答案通過使用for
直接通配符解決了“不要使用ls
輸出”。 我不會解釋這些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.