[英]Escape space character in command line argument for bash script
我有一個 bash 腳本,它采用逗號分隔的文件路徑列表,將它們解析為數組,然后在每個文件上執行環境變量替換 function ( [envsubst][1]
)。 但是,其中一個路徑包含一個空格,到目前為止,它不是重命名文件夾的選項。 有沒有辦法轉義文件中的空間並將其作為參數傳遞到我的腳本中,這樣second
和path
就不會被解釋為兩個單獨的變量? 我已經嘗試了一些我在 SO/在線帖子中看到的嘗試,包括:
第二個\路徑/file.txt
第二個%qpath/file.txt
'第二個路徑/file.txt'
“第二個路徑/file.txt”
這些中的每一個都以 function 將單詞“second”和“path/file.txt”分開。
命令行界面
$sh envsub.sh first/path.txt,second path/file.txt
sh腳本
#!/bin/bash
IFS=', ' read -r -a array <<< "${@}"
for t in ${array[@]}; do
envsubst < $t > "${t}_new"
done
首先,如果你希望你的參數被解析為逗號分隔,為什么你的 IFS 中有一個空格(你不想分隔任何東西)?
改變:
IFS=', ' read -r -a array <<< "${@}"
至:
IFS=',' read -r -a array <<< "${@}"
瞧,空格不再分隔參數,並且您可以根據需要使${array[1]}
包含second path/file.txt
。
然后是第二個陷阱:
for t in ${array[@]};
${array[@]}
擴展為array
的所有成員,它們是兩個(由IFS
中的第一個字符分隔),其中一個包含空格。
而且由於您的IFS
重新定義僅適用於您的read
行,因此for
現在將使用默認值,該默認值再次包含空格作為分隔符。 而for
將在second
和path
之間的空間分隔列表...
因此,重新定義 IFS 以僅包含逗號,用於read
和for
:
#!/bin/bash
IFS=','
read -r -a array <<< "${@}"
for t in ${array[@]}
do
envsubst < $t > "${t}_new"
done
那里有 go。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.