簡體   English   中英

bash 腳本的命令行參數中的轉義空格字符

[英]Escape space character in command line argument for bash script

我有一個 bash 腳本,它采用逗號分隔的文件路徑列表,將它們解析為數組,然后在每個文件上執行環境變量替換 function ( [envsubst][1] )。 但是,其中一個路徑包含一個空格,到目前為止,它不是重命名文件夾的選項。 有沒有辦法轉義文件中的空間並將其作為參數傳遞到我的腳本中,這樣secondpath就不會被解釋為兩個單獨的變量? 我已經嘗試了一些我在 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將在secondpath之間的空間分隔列表...

因此,重新定義 IFS 以包含逗號,用於readfor

#!/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.

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