0

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]

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

在此处输入图像描述

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

4

1 回答 1

3

TesselatingHeckler 的答案是正确的。

从手册页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

希望这可以帮助!

于 2015-09-18T04:30:58.317 回答