gpt4 book ai didi

bash - 转义 bash 变量中的特殊字符

转载 作者:行者123 更新时间:2023-11-29 09:09:17 30 4
gpt4 key购买 nike

我正在尝试逐行读取包含文件路径的文件并将文件发送到另一台服务器,但由于文件名中的某些字符,如“(”、“)”、“&”等,我需要转义输入:

输入.txt:

/folder1/folderA/filename+(oh+how+nice,+parantheses)

script.sh:

#!/bin/sh

promote_to=random.server.com
dev_catalog=/folderX/
uat_catalog=/folderY/

while read line
do
uat_path=$(echo "$uat_catalog$line" | sed -e "s/(/\\\(/g" | sed -e "s/)/\\\)/g")
dev_path=$(echo "$dev_catalog$line" | sed -e "s/(/\\\(/g" | sed -e "s/)/\\\)/g")

scp $dev_path user@$promote_to:$uat_path
scp $dev_path".atr" user@$promote_to:$uat_path".atr"
done < "input.txt"

输出:

-bash: /folder1/folderA/filename+(oh+how+nice,+parantheses): No such file or directory
-bash: /folder1/folderA/filename+(oh+how+nice,+parantheses): No such file or directory
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
ssh: random.server.com: Name or service not known
lost connection

感谢任何形式的帮助。

最佳答案

这里的部分问题是本地和远程文件名的解析方式不同:直接使用本地文件名,因此您唯一需要做的就是用双引号将其括起来(如@Ignacio 的回答),但是远程文件名被传递到远程 shell,该 shell 通过另一层解析(引号和转义删除等)运行它。所以,您希望向远程路径添加转义符。我还冒昧地稍微简化了 sed 命令:

#!/bin/sh

promote_to=random.server.com
dev_catalog=/folderX/
uat_catalog=/folderY/

while read line
do
uat_path="$(echo "$uat_catalog$line" | sed -e 's/[()&]/\\&/g')"
dev_path="$dev_catalog$line"

scp "$dev_path" "user@$promote_to:$uat_path"
scp "$dev_path.atr" "user@$promote_to:$uat_path.atr"
done < "input.txt"

请注意,我使用的 sed 模式 's/[()&]/\\&/g' 仅对括号和符号进行转义;如果您的文件名包含任何其他 shell 元字符,请务必将它们添加到 [] 中的字符列表中。

关于bash - 转义 bash 变量中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9483171/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com