Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。
参数解释:
-i :information,执行命令时候提示是否确定执行
Ls –F:区分文件和目录
Ls –a(all):列出所有文件
Ls –R:显示当前目录下的内容及子目录下的内容
通配符:?代表一个字符,*代表多个字符 ls my*a
单点符表示当前工作目录:cp /etc/a.conf .
CP –R:复制整个目录的内容 cp –R SCRIPTS/ AA
Mv命令只影响文件名,不影响时间戳等其它内容,可以既移动文件(目录)位置又修改名称,mv也可以移动
同时创建多个目录和子目录用–p参数:mkdir –p home/sss/sss
rm –r:向下进入目录,删除其中的文件,再删除目录本身
rm –rf:一口气删除目录及其里面的所有内容
cat –n:给所有的行加上行号
more命令:使用空格键或回车键浏览文件
以.开头的文件是隐藏文件
数组变量:mytest=(one two three four five)
Echo $mytest
Echo ${mytest [2]}
Ls –l 命令结果的第一个字符代表了对象的类型:-代表文件 d代表目录 第2-4位代表文件属主的权限5-7位代表属组成员的权限 8-10位代表其他用户的权限 -rwxrwxrwx
Chmod用来改变文件和目录的安全性设置
Chown用来改变文件的属主
Chgrp用来改变文件的默认属组
shell可以让你将多个命令串起来,一次执行完成。如果要两个命令一起运行,可以
把它们放在同一行中,彼此间用分号隔开。
$ date ; who
echo 命令后面加上了一个字符串,该命令就能显示出这个文本字符串。
$ echo This is a test
echo 命令可用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,你需要在
文本中使用其中一种引号,而用另外一种来将字符串划定起来。
$ echo "This is a test to see ifyou're paying attention"
This is a test to see if you're payingattention
$ echo 'Rich says "scripting iseasy".'
Rich says "scripting is easy".
把文本字符串和命令输出显示在同一行中,该怎么办呢?可以用 echo 语句
的 -n 参数。只要将第一个 echo 语句改成这样就行:
echo -n "The time and date are: "
set 命令:显示一份完整的当前环境变量列表
shell脚本:
只要脚本在引号中出现美元符$,它就会以为你在引用一个变量。
反斜线允许shell脚本将美元符解读为实际的美元符,而不是变量。
echo "The cost of the item is\$15"
The cost of the item is $15
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格
将命令输出赋给变量:
1. 反引号字符( ` ) testing='date'
2.$() 格式 testing=$(date)
if-then 语句有如下格式:
if command
then
commands
fi
在其他编程语言
中, if 语句之后的对象是一个等式,这个等式的求值结果为 TRUE 或 FALSE 。但bash shell的 if 语
句并不是这么做的。bash shell的 if 语句会运行 if 后面的那个命令。如果该命令的退出状态码(参见第11章)是 0
(该命令成功运行),位于 then 部分的命令就会被执行。如果该命令的退出状态码是其他值, then部分的命令就不会被执行,bashshell会继续执行脚本中的下一个命令。 fi 语句用来表示 if-then
语句到此结束。
$ cat test1.sh
#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi
$
结果:
$ ./test1.sh
/home/Christine
It worked
$
elif 语句:
if command1
then
commands
elif command2
then
more commands
fi
test 命令提供了在 if-then 语句中测试不同条件的途径。如果 test 命令中列出的条件成立,
test 命令就会退出并返回退出状态码 0 。这样 if-then 语句就与其他编程语言中的if-then 语句
以类似的方式工作了。如果条件不成立, test 命令就会退出并返回非零的退出状态码,这使得
if-then 语句不会再被执行。
bash shell提供了另一种条件测试方法,无需在if-then 语句中声明 test 命令。
if [ condition ]
then
commands
fi
方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,
否则就会报错。
test 命令可以判断三类条件:
数值比较
字符串比较
文件比较
test 命令的数值比较功能
n1 -eq n2
检查 n1 是否与 n2 相等
n1 -ge n2
检查 n1 是否大于或等于 n2
n1 -gt n2
检查 n1 是否大于 n2
n1 -le n2
检查 n1 是否小于或等于 n2
n1 -lt n2
检查 n1 是否小于 n2
n1 -ne n2
检查 n1 是否不等于 n2
在运行脚本时向命令
行添加数据。
$ ./addem 10 30
bash shell会将一些称为位置参数(positionalparameter)的特殊变量分配给输入到命令行中的
所有参数。这也包括shell所执行的脚本名称。位置参数变量是标准的数字: $0 是程序名, $1 是第
一个参数, $2 是第二个参数,依次类推,直到第九个参数 $9 。
shell将输入到命令行的字符串值传给脚本。但碰到含有空格的文本字符串时就会出现问题,
每个参数都是用空格分隔的,所以shell会将空格当成两个值的分隔符。要在参数值中
包含空格,必须要用引号(单引号或双引号均可)。
$ ./test3.sh 'Rich Blum'
Hello Rich Blum, glad to meet you.
$
$ ./test3.sh "Rich Blum"
Hello Rich Blum, glad to meet you.
可以用 $0 参数获取shell在命令行启动的脚本名。
basename 命令会返回不包含路径的脚本名。
name=$(basename $0)
echo
echo The script name is: $name
测试参数(-n):测试在执行脚本时是否有参数输入:
if [ -n "$1" ]
then
echo Hello $1, glad to meet you.
else
echo "Sorry, you did not identifyyourself. "
fi
特殊变量 $# 含有脚本运行时携带的命令行参数的个数。可以在脚本中任何地方使用这个特殊
变量,就跟普通变量一样。
echo There were $# parameters supplied.
$* 和 $@ 变量可以用来轻松访问所有的参数。这两个变量都能够在单个变量中存储所有的命
令行参数。
$* 变量会将命令行上提供的所有参数当作一个单词保存。这个单词包含了命令行中出现的每
一个参数值。基本上 $* 变量会将这些参数视为一个整体,而不是多个个体。
另一方面, $@ 变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词。这样
你就能够遍历所有的参数值,得到每个参数。这通常通过 for 命令完成。
它会将每个参数变量向左移动一个位置。所以,变量 $3
的值会移到 $2 中,变量 $2 的值会移到 $1 中,而变量 $1 的值则会被删除(注意,变量 $0 的值,也
就是程序名,不会改变)。
这是遍历命令行参数的另一个好方法,尤其是在你不知道到底有多少参数时。你可以只操作
第一个参数,移动参数,然后继续操作第一个参数。
echo
count=1
while [ -n "$1" ]
do
echo "Parameter #$count = $1"
count=$[ $count + 1 ]
shift
done
使用 shift 命令的时候要小心。如果某个参数被移出,它的值就被丢弃了,无法再恢复。
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) echo "Found the -b option" ;;
-c) echo "Found the -c option" ;;
*) echo "$1 is not an option" ;;
esac
shift
done
$
$ ./test15.sh -a -b -c -d
Found the -a option
Found the -b option
Found the -c option
-d is not an option