我在设置变量时尝试保留变量中的特殊字符。我试图将文件路径保存为变量。例如:
提示
用户输入
点击并拖动您的文件
/ Users / leetbacon / Desktop / My \ Stuff / time \ to \ fly \ \& \ soar.png
您选择/ Users / leetbacon / Desktop / My \ Stuff / time \ to \ fly \ \& \ soar.png
相反,每当我输入文件时,它总是像这样输出(我不想要):
您选择/ Users / leetbacon / Desktop / My Stuff / time to fly& soar.png
有什么方法可以让它存储我想要的变量吗?
这是我现在的代码:
echo 'click and drag your file here'
read -p " " FilepatH
echo 'You chose '"$FilepatH"
我想保留所有特殊字符。我只是想编写一个可以涵盖文件名所有可能性的脚本。
我正在使用OS X Yosemite
- 托德
答案 0 :(得分:1)
我希望保留所有特殊字符。
完成。在您发布的脚本中,所有字符都会被保留。
您可以通过运行来验证它们是否真正保留:
ls "$FilepatH"
这只会因为保留所有特殊字符而起作用。如果它们没有被保存下来就行不通,就找不到文件了。
但是,您可能希望通过输出澄清意图:
echo "You chose '$FilepatH'"
这将打印:
You chose '/Users/leetbacon/Desktop/My Stuff/time to fly & soar.png'
答案 1 :(得分:0)
您可以通过使用read
(" raw")选项告诉-r
跳过解析(和删除)转义和引号。但是,正如大家所说,你不想这样做。在分配给shell变量的值中嵌入转义和/或引号并没有做任何有用的事情,因为shell在扩展变量时不会解析它们。有关某人特别遇到问题的示例,请参阅this question,因为他们在尝试使用的文件名中嵌入了转义符。
以下是这样做的一个例子:
$ cat t1.sh
#!/bin/bash
echo 'click and drag your file here'
read -p " " FilepatH
echo 'You chose '"$FilepatH"
echo
echo "Trying to use the variable with double-quotes:"
ls -l "$FilepatH"
$ ./t1.sh
click and drag your file here
/Users/gordon/weird\ chars\:\ \'\"\\\(\)\&\;.txt
You chose /Users/gordon/weird chars: '"\()&;.txt
Trying to use the variable with double-quotes:
-rw-r--r-- 1 gordon staff 0 Jul 19 22:56 /Users/gordon/weird chars: '"\()&;.txt
这里做错了(read -r
):
$ cat t2.sh
#!/bin/bash
echo 'click and drag your file here'
read -r -p " " FilepatH
echo 'You chose '"$FilepatH"
echo
echo "Trying to use the variable with double-quotes:"
ls -l "$FilepatH"
echo
echo "Trying to use the variable without double-quotes:"
ls -l $FilepatH
$ ./t2.sh
click and drag your file here
/Users/gordon/weird\ chars\:\ \'\"\\\(\)\&\;.txt
You chose /Users/gordon/weird\ chars\:\ \'\"\\\(\)\&\;.txt
Trying to use the variable with double-quotes:
ls: /Users/gordon/weird\ chars\:\ \'\"\\\(\)\&\;.txt: No such file or directory
Trying to use the variable without double-quotes:
ls: /Users/gordon/weird\: No such file or directory
ls: \'\"\\\(\)\&\;.txt: No such file or directory
ls: chars\:\: No such file or directory
请注意,对于双引号中的变量,它尝试将转义视为文件名的文字部分。没有它们,它会根据空格将文件路径拆分为单独的项目,然后仍然将转义视为文件名的文字部分。