很多重要的值存储在我们所说的Linux系统“变量”,但实际上有几种类型的变量和一些有趣的命令,可以帮助您与他们合作。在以前的文章中,我们看环境变量并在他们的定义。在这篇文章中,我们将看看那些在命令行和脚本中使用的变量。
用户变量
虽然这是很容易设置一个变量在命令行中,也有一些有趣的技巧。要设置一个变量,所有你需要做的是这样的:
$ myvar=11 $ myvar2=" 11 "
要显示的值,你只需做到这一点:
$ echo $myvar 11 $ echo $myvar2 11
您也可以与您的变量的工作。例如,为了增加一个数字变量,你可以使用这些命令:
$ MYVAR = $((MYVAR + 1))$回波$ MYVAR 12 $((MYVAR = MYVAR + 1))$回波$ MYVAR 13 $((MYVAR + = 1))$回波$ MYVAR 14 $((MYVAR ++))$ $回声15 MYVAR $让 “MYVAR = MYVAR + 1” $ $回声16 MYVAR $让 “MYVAR + = 1” $ $回声17 MYVAR $让 “MYVAR ++” $ $回声18 MYVAR
使用其中的一些,您可以向变量的值添加多于1的值。例如:
$myvar0 =0 $ ((myvar0++))) $ echo $myvar0 1 $ (((myvar0+=10)) $ echo $myvar0 11
有了所有这些选择,您可能会发现至少有一个是容易记住和方便使用的。
你也可以未设置一个变量——基本上取消了它的定义。
$未设置MYVAR $回声$ MYVAR
另一个有趣的选择是,你可以设置一个变量,并使它只读。换句话说,一旦设定为只读,其值不能被改变(至少在没有一些非常棘手的命令行魔法)。这意味着你也不能取消它。
$ readonly myvar3=1 $ echo $myvar3 1 $ ((myvar3++)) -bash: myvar3: readonly变量$ unset myvar3 -bash: unset: myvar3: can unset: readonly变量
您可以使用这些设置和递增选项中的任何一个来分配和操作脚本中的变量,但是也有一些非常有用的选项内部变量用于在脚本中工作。注意,您不能重新分配它们的值或增加它们。
内部变量
有迹象表明,可以在脚本中用来评估参数,并显示有关脚本本身的信息相当多的变量。
- $ 1,$ 2,$ 3等代表的第一,第二,第三等参数传递给脚本。
- $#表示参数的数量。
- $*表示参数字符串。
- $ 0表示脚本本身的名称。
- $ ?表示先前运行命令的返回代码(0=成功)。
- $$示出了用于该脚本的进程ID。
- $ PPID显示了你的shell(该脚本的父进程)的进程ID。
其中一些变量也可以在命令行上工作,但是会显示相关信息:
- $0显示您正在使用的shell的名称(例如-bash)。
- $$所示为你的shell的进程ID。
- $PPID显示shell的父进程的进程ID(对我来说,这是sshd)。
如果我们把所有这些变量放到一个脚本中,只是为了看看结果,我们可能会这样做:
# !/bin/bash echo $0 echo $1 echo $2 echo $# echo $* echo $?echo $$ echo $PPID
当我们把这个剧本,我们会看到这样的事情:
$ tryme one two three /home/shs/bin/tryme <== script name one <==第一个参数2 <==第二个参数3 <==参数个数1,2,3 <==所有参数0 <==前一个echo命令10410的返回码<== script的进程ID 10109 <==父进程ID
一旦脚本运行完成,如果我们检查shell的进程ID,我们可以看到它匹配脚本中显示的PPID:
$ $$回声10109 <==壳的进程ID
当然,我们更可能以更有用的方式使用这些变量,而不是简单地显示它们的值。让我们看看我们可以做这个的一些方法。
检查参数是否已提供:
如果[$#== 0];然后回声“$ 0文件名” 1个出口科幻
检查是否一个特定的进程正在运行:
PS -ef |grep的的Apache2>的/ dev / null的,如果[$?!= 0];然后回显Apache不运行退出网络
验证文件试图访问它之前存在:
如果[$#-lt 2];然后回声“用法:$ 0线文件名” 1号出口科幻如果[!-f $ 2];然后回声“错误:文件$ 2未找到”退出2否则头 - $ 1 $ 2网络连接
而在这个小脚本,我们检查是否已提供正确的参数个数,如果第一个参数是数字,如果第二个参数是现有文件。
如果#/斌/庆典[$#-lt 2]!;然后回声:如果 “用法$零线文件名” 出口1音响[![$ 1 = [0-9] *]];然后回声“错误:$ 1不是数字” 2号出口科幻如果[!-f $ 2];然后回声“错误:文件$ 2上找不到”退出文件头3否则回波顶 - $ 1 $ 2网络连接
重命名变量
当编写一个复杂的脚本,它的而不是继续把它们称为$ 1,$ 2,依此类推经常有用到指定名称脚本的参数。由第35行,有人读你的脚本可能已经忘记了$ 2代表。如果您分配的一个重要参数的值,以$文件名或$ numlines这将是该人容易得多。
如果#/斌/庆典[$#-lt 2]!;如果[[$numlines !=[0-9]*]],则回传"Usage: $0 lines filename"退出1 else numlines=$1 filename=$2 fi;然后回传"Error: $numlines is not numeric"退出2 fi if [!- f $ filename);然后回传"Error: File $filename not found"出口3 else回传文件头的顶部-$numlines $filename fi
当然,这个脚本例子没有什么比运行头命令显示文件中的顶级X线,但为了显示参数是如何内部可以脚本中使用,以帮助确保脚本运行良好或者失败,至少一些清晰度。