簡體   English   中英

在bash腳本中轉義字符時出現問題

[英]Problem escaping characters in bash script

我真的是bash腳本的新手,我正在嘗試創建一個shell腳本以使用cron處理視頻,但我真的不知道發生了什么

#!/bin/bash

args=("$@")
count=0
startingfrom=5

args1="-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i"
args2='-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "'
args12="-r 29.97 -ss 00:40:30 -vsync 0 -vpre libx264-medium -i"
args3="-vcodec libx264 -acodec libfaac"

for file in /home/allen/s/
do


eppart1 = "$args[0]_$startingfrom_01_01_02.mp4"
eppart2 = "$args[0]_$startingfrom_01_02_02.mp4"

/usr/local/bin/ffmpeg $args1 "$file"  $args2 $args3 "${args[0]}_${startingfrom}_01_01_02.mp4"

mv "${args[0]}_${startingfrom}_01_01_02.mp4" upload/

/usr/local/bin/ffmpeg $args12 "$file" $args2 $args3 "${args[0]}_${startingfrom}_01_02_02.mp4"

mv "${args[0]}_${startingfrom}_01_02_02.mp4" upload/



let "count += 1"
let "startingfrom +=1"
echo "$count"

echo ${args[0]}
echo ${args[1]}

done

/usr/local/bin/python2.5 /home/allen/s/process.py

問題始於這個論點

args2='-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "'

我不知道是否是因為特殊字符,通常如果我輸入整個命令都可以,但是在bash腳本中是不同的

它給我的輸出

Unable to find a suitable output format for 'scale=580:380'

盡管就像我說的那樣,如果我運行整個命令,它就可以工作

在回顯之前執行將要執行的操作,因此您將看到將傳遞給命令的內容;

           something $args2

將擴展到

           something -vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "

例如,使用兩個參數調用某個東西,一個是一個選項(或兩個選項),另一個是“單個”字符串; 我想你不要雙引號。

下面的行有兩個問題。 首先,等號周圍不能有空格。 其次,當您嘗試在雙引號字符串中使用變量時,需要使用花括號。

eppart1 = "$args[0]_$startingfrom_01_01_02.mp4"

您需要的是:

eppart1="$args[0]_${startingfrom}_01_01_02.mp4"

否則,bash將尋找由startingfrom_01_01_02標識的變量,而不是startingfrom

您似乎在以后的行中已解決此問題,所以也許您只是粘貼了舊版本?

除此之外,其他人所說的是正確的:除了確定賦值和正確值之前,您應僅執行賦值和回顯操作。

將引號放在變量值內(就像您對args2所做的那樣)不會達到您的期望。 具體來說,使用變量時,它們不會被解析為引號,而會被解析為常規字符。 因此,如果您這樣做:

args2='-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "'
somecmd $args2

它最終等於:

somecmd '-vf' '"[in]' 'scale=580:380' '[T1],[T1]' 'pad=720:530:0:50' '[out]' '"'

請注意,雙引號不會被解釋為將單詞分組在一起,而是將它們作為單詞的一部分傳遞給命令-根本不是您想要的。 順便說一句,在這種情況下,使用echo進行調試將無濟於事-一切都會好起來的,因為echo並沒有清楚地區分所獲取的參數。 取而代之的是,使用set -x將使bash在執行命令時打印命令,並澄清其解析。

現在,關於修復它。 如果您需要將命令參數存儲在變量中(如此處所做的操作)並跟蹤單詞邊界在哪里(如您嘗試使用雙引號一樣),則標准答案是使用數組代替簡單變量。 創建每個參數作為數組元素的數組,然后將其與習慣用法"${arrayname[@]}"一起使用該數組(請注意,其周圍的雙引號非常重要)。 這是我上面的示例:

args2=(-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] ")
somecmd "${args2[@]}"

或在您的腳本中:

...
args2=(-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] ")

...

/usr/local/bin/ffmpeg $args1 "$file" "${args2[@]}" $args3 "${args[0]}_${startingfrom}_01_01_02.mp4"

mv "${args[0]}_${startingfrom}_01_01_02.mp4" upload/

/usr/local/bin/ffmpeg $args12 "$file" "${args2[@]}" $args3 "${args[0]}_${startingfrom}_01_02_02.mp4"
...

順便說一句,不必對您的其他“ arg”變量執行相同的操作(因為它們不包含任何帶有空格的參數),但不會受到損害,可以認為是一種好習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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