头部使用环境变量

时间:2018-07-03 12:11:40

标签: linux shell

我需要在使用tailhead的脚本中使用一些变量,当我在终端中键入脚本但在.sh文件中时,脚本可以工作从head命令获得此错误:

head: option requires an argument -- n
usage: head [-n lines | -c bytes] [file ...]

错误来自我的脚本的这个管道:

 head -n $LINE

我尝试在另一个脚本中使用变量,但只能在终端中声明该变量。 我的一个朋友告诉我这样做,但是可以,但是我不明白为什么。

export LINE=15

2 个答案:

答案 0 :(得分:1)

我不确定您对哪个部分感到困惑,但这就是正在发生的事情。 head -n $LINE期望一个整数,因此如果$LINE为空,则head -n不知道要多少行。示例:

(pi5 212) $ unset LINE            # make sure $LINE is empty
(pi5 213) $ echo $LINE            # show it is empty

(pi5 214) $ head -n $LINE < /etc/motd        # see what happens if we try this
head: option requires an argument -- 'n'
Try 'head --help' for more information.
(pi5 215) $ echo "head -n $LINE < /etc/motd"     # this is what the shell sees
head -n  < /etc/motd


(pi5 216) $ export LINE=1     # try it again with LINE set to an integer
(pi5 217) $ echo $LINE
1
(pi5 218) $ head -n $LINE < /etc/motd       
#    ___________
(pi5 219) $ echo "head -n $LINE < /etc/motd"  # it worked! display what the shell sees.
head -n 1 < /etc/motd
(pi5 220) $ 

如果您的问题是关于为什么需要使用export ...的问题,那么这就是shell的功能。这是一个示例:

(pi4 594) $ cat /tmp/x.sh
#!/bin/sh
echo "$foo"

(pi4 595) $ echo $foo

(pi4 596) $ /tmp/x.sh

(pi4 597) $ foo="bar"
(pi4 598) $ /tmp/x.sh

(pi4 599) $ export foo="bar"
(pi4 600) $ /tmp/x.sh
bar

在这里解释:

(pi4 601) $ man sh
...
When a simple command other than a builtin or shell function is to be executed,
it is invoked in a separate execution environment that consists of the following.  
Unless otherwise noted, the values are inherited from the shell.
...
    o      shell variables and functions marked for export, along with variables
           exported for the command, passed in the environment
...
export [-fn] [name[=word]] ...
export -p
          The supplied names are marked for automatic export to the environment
          of subsequently executed commands. 

答案 1 :(得分:1)

JParameters[0]["Antibiotic after diagnosis"]使您的Shell脚本能够正常工作,因为它使变量export LINE=15可用于除创建该变量的外壳程序之外的其他外壳程序。

您的脚本,要么是因为它自己启动了一个新的Shell实例(由于使用了LINE或任何其他Unix shebang),要么是因为您通过显式调用Shell({{ 1}},例如#!/bin/sh),则不会使用与控制台相同的shell实例。

这很好地解释了here at IBM

  

本地shell变量是仅创建它的shell已知的变量。如果启动新的外壳程序,则旧外壳程序的变量是未知的。如果要打开的新外壳使用旧外壳中的变量,请导出变量以使其全局。

您可以使用 export 命令将其设为本地全局变量。

(此链接页面与AIX相关,但这实际上是一般性的说明。)