https://www.youtube.com/watch?v=bu3_RzzEiVo
我的目的是在文件中试验shell脚本。 (FreeBSD 10.2)
我创建了一个名为script.sh
的文件cat > script.sh
set dir = `pwd`
echo The date today is `date`
echo The current directory is $dir
[Ctrl-d]
在赋予执行权限后,我运行命令
sh script.sh
我得到了
为什么不显示目录?
然后我做了一个改变。
cat > script.sh
set dir = `pwd`
echo The date today is `date`
echo The current directory is `pwd`
[Ctrl-d]
这一次,它运作正常。目录显示成功。
我想知道为什么?谁能告诉我?
答案 0 :(得分:3)
TessellatingHeckler的回答是正确的。
来自sh(1)
的手册页:
set [-/+abCEefIimnpTuVvx] [-/+o longname] [-c string] [-- arg ...]
The set command performs three different functions:
With no arguments, it lists the values of all shell variables.
If options are given, either in short form or using the long
``-/+o longname'' form, it sets or clears the specified options
as described in the section called Argument List Processing.
如果您想要命令来设置环境变量,那么该命令将是setvar
,您可以按如下方式使用该命令:
setvar dir `pwd`
然而,这是不常见的用法。更常见的同义词是:
dir=`pwd`
或
dir=$(pwd)
请注意,等号周围没有空格。
另请注意,如果您选择使用setvar
命令,最好将您的值放在引号内。以下内容会产生错误:
$ mkdir foo\ bar
$ cd foo\ bar
$ setvar dir `pwd`
相反,你需要:
$ setvar dir "`pwd`"
或者更清楚:
$ dir="$(pwd)"
请注意,您可能还需要export
您的变量。 export命令用于标记应该传递给正在运行的shell生成的子shell的变量。一个例子应该更清楚:
$ foo="bar"
$ sh -c 'echo $foo'
$ export foo
$ sh -c 'echo $foo'
bar
我要添加的另一件事是,在您的脚本中使用date
是常见且不必要的,因为该命令可以生成自己的格式输出。试试这个:
$ date '+The date today is %+'
对于日期选项,您可以man date
和man strftime
。
最后提示:使用echo
时,请将内容放在引号中。您将产生更少的混乱和更合理的输出。注意:
$ foo="`printf 'a\nb\n'`"
$ echo $foo
a b
$ echo "$foo"
a
b
希望这有帮助!
答案 1 :(得分:-3)
代码的这一行:
echo The current directory is $dir
您应该使用%dir%
代替$dir
那就行了。