我是 Shell 脚本的新手,并按照这个快速指南进行了操作:
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
这很有帮助,但留下了很多关于使用变量的问题没有得到解答。我目前的挫败之处在于尝试使用一个在命令中存储路径的变量。
例如以下脚本:
#!/bin/bash
iTunesU_Source="~/Music/iTunes/iTunes\ Media/iTunes\ U/"
ls -al $iTunesU_Source
iTunesU_Source_symlink="~/Music/iTunes_U/"
ls -al $iTunesU_Source_symlink
ls -al ~/Music/iTunes/iTunes\ Media/iTunes\ U/
打印出:
ls: Media/iTunes\: No such file or directory
ls: U/: No such file or directory
ls: ~/Music/iTunes/iTunes\: No such file or directory
ls: ~/Music/iTunes_U/: No such file or directory
total 0
drwxr-xr-x 7 me staff 238 Mar 8 10:06 .
drwxr-xr-x 11 me staff 374 Mar 8 11:13 ..
drwxr-xr-x 27 me staff 918 Mar 8 08:44 Game Theory - Audio
drwxr-xr-x 3 me staff 102 Mar 8 10:03 Introduction to Algorithms
drwxr-xr-x 23 me staff 782 Mar 8 12:17 Machine Learning
drwxr-xr-x 3 me staff 102 Mar 8 10:06 Machine Learning-Stanford
如何让命令(ls/cd/etc...)像直接输入一样接受变量的值?
答案1
简单的解决方案:
iTunesU_Source="~/Music/iTunes/iTunes Media/iTunes U/"
这是为什么呢?在以下这一行中:
iTunesU_Source="~/Music/iTunes/iTunes\ Media/iTunes\ U/"
您将变量的值设置为带引号的字符串。在引号内,空格已保留。因此,变量的内容将是:
~/Music/iTunes/iTunes\ Media/iTunes\ U/
反斜杠只需要转义未加引号的字符串中的空格,因此你可以几乎写成如下形式:
iTunesU_Source=~/Music/iTunes/iTunes\ Media/iTunes\ U/
不同之处在于,在第一个命令中,~
shell 不会将 扩展到您的主目录,而在第二个命令中,您的变量iTunesU_Source
被分配/Users/username
。因此,在这种情况下,您的变量将保留:
/Users/username/Music/iTunes/iTunes\ Media/iTunes\ U/
在此处了解有关引用的更多信息: