变量赋值
变量的赋值有五种:使用read命令,直接赋值,使用命令行参数,使用命令行的输出结果,从文件读取。
1
先说一下从read命令吧:(主要是在需要交互时使用)
Read命令是系统内置命令,语法格式为:
read 变量1
变量2
当Shell脚本执行到read命令时,将暂停脚本的执行并等待键盘的输入,当用户输入完毕并且敲下回车之后,将完成赋值操作,脚本继续执行。
Read指令的规则:
多个数据或变量之间用空格隔开
若变量个数与数据个数相等时,对应取值
若变量个数大于数据个数时,没有输入数据的变量取空值
若变量个数小于数据个数时,将多余的数据赋给最后一个变量(也就是把空格当成字符串处理)
例子:
#!/bin/bash
echo -n “ please enter your name” //-n
表示用户输入和提示信息在同一行
read name
echo “your name is $name”
#!/bin/bash
echo
“Please enter your first name and last name :”
read first last
echo
“your first name is $first”
echo “your last name is $last”
2 第二种赋值方法就是直接给变量赋值(这种赋值方法主要是在不需要交互时,并且参数不需要修改时使用)
例如:name=xiaosu
gender=man
3
第三种赋值方法是使用命令行参数赋值。(这种赋值方法是参数需要经常变化,并且不需要交互时使用)
这种赋值方法,也就是直接在命令后面跟参数,然后系统用$1来引用第一个参数。
a="$PWD"
echo
$a
filename=$1
if [ -e "${filename}" ]
4
第四种方法是利用命令的输出结果赋值(这种赋值方法可以直接处理上个命令产生的数据)
在Shell程序中,可以将一个命令的输出结果来当做变量,不过需要在赋值语句中使用反引号
例如currentdir=`pwd`
echo $currentdir
5
最后一种赋值方法是从文件中读入数据
这种方式就适合处理大批量的数据,直接把相应的数据写入文件,然后运行脚本即可。
通常是通过while循环一行行读入数据,即每循环一次,就从文件中读取一行数据,直到读取到文件的结尾。
例如:
#!/bin/bash
ls
*.sh >execfile
while read LINE
do
chmod a+x $LINE
done
<execfile
这个脚本使用了while..do..done 结构,最后一行表示从文件execfile读取数据。while read
LINE表示 每次循环读入一行数据并赋值给变量LINE。
6 变量的输出
最简单的方法就是使用echo
如果想输出格式化的字符串,就需要使用printf,用法和C语言类似
printf
命令的格式说明符
\” 输出双引号
\\ 输出反斜杠
\a 响铃
\n 换行
\r 回车
特殊变量
# vi variable
#!/bin/sh
echo
"number:$#"
echo "scname:$0"
echo "first:$1"
echo "second:$2"
echo
"argume:[email protected]"
echo "show parm list:$*"
echo "show process id:$$"
echo
"show precomm stat:$?"
# chmod +x variable
# ./variable aa
bb
number:2
scname:./variable
first:aa
second:bb
argume:aa
bb
show parm list:aa bb
show process id:24544
show precomm
stat:0
通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1
是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
[email protected] 是传给脚本的所有参数的列表
$*
是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
该变量包含了所有输入的命令行参数值。如果您运行showrpm
openssh.rpm w3m.rpm webgrep.rpm
此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and
webgrep.rpm.
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误