簡體   English   中英

在bash腳本中擴展變量以在單引號中傳遞其值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM