为什么文件中的命令无法正常工作? (FreeBSD 10.2)

时间:2015-09-18 03:40:20

标签: shell freebsd pwd

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

我得到了

enter image description here

为什么不显示目录?

然后我做了一个改变。

   cat > script.sh
    set dir = `pwd`
    echo The date today is `date`
    echo The current directory is `pwd`
    [Ctrl-d]

这一次,它运作正常。目录显示成功。

enter image description here

我想知道为什么?谁能告诉我?

2 个答案:

答案 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 dateman 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 那就行了。