Linux shell 是作为用户与Linux系统间接口的程序,也就是linux命令解释器。
shell有三类:
/bin/sh
/bin/csh
/bin/ksh
重定向:将标准输入(0)、标准输出(1)、标准错误输出(2)绑定到键盘、屏幕、文件等位置
输出重定向:>或>>
输入重定向:<或<<
错误重定向:2>或2>>
错误和正确重定向:2>&1
例如:
ls>ls.txt
:将ls重定向到ls.txt
cat <1.sh
:将1.sh文件的内容输入重定向到cat命令
ls>error.txt 2>&1> ok.txt
:将ls的错误输出重定向到error.txt,正确输出重定向到ok.txt
ls >kk.txt 2>&1
:表示重定向文件为重定向的错误和正确输出文件
管道:将一个命令的输出作为后一个命令的输入
例如:
ls -l | grep '^d'
:将ls -l 的输出结果作为 grep '^d'命令的输入
等同于下面的代码:
ls -l ls.txt
grep '^d' ls.txt
系统环境变量:
HOME=/root :表示当前用户的家目录
HOSTNAME=server1:主机名
LOGNAME=liu:登录名
USER=root:当前用户名
SHELL=/bin/bash:当前shell的类型
$0 :shell脚本的名字
$# :传递给脚本的参数个数
$$:shell脚本的进程号
$*/$@:都表示列出所有参数,唯一差别是$*列出参数间以环境变量IFS的第一个字符为字符间隔,而$@始终以空格为间隔
$1,$2,....:分别表示第一个参数,第二个参数,....
引号问题:
单引号下变量不会执行,双引号下会执行。
例如:
var = hello
echo "var is $var"
echo ' var is $var '
执行结果:
var is hello
var is $var
在shell中通过在变量名前加上一个$符号来访问它的内容。
如果字符串中包含空格,必须要用引号括起来,因为所有变量都被看做字符串并以字符串来存储。
使用read命令将用户的输入赋值给一个变量。
条件:
test或[]命令:检查一个文件是否存在
语法:
test -f <filename>或
[ -f filename ]
比如:
if test -f fred.c
then
...
fi
就是说当fred.c存在执行then后面的语句
同理:
if [ -f fred.c ]
then
...
fi
必须在[符号与被检查的条件之间留一个空格,因为[]等同与test,命令要与条件参数或者选项之间留一个空间
1.字符串比较
string1 = string2
string1 !=string2
-n string :字符串string不为空时结果为真
-z string :字符串string为null则结果为真
2.算术比较
expr1 -eq expr2 :两表达式相等为真
expr1 -ne expr2 :两表达式不等为真
expr1 -gt expr2 :expr1>expr2则为真
expr1 -ge expr2 : expr1>=expr2则为真
expr1 -lt expr2 : expr1<expr2 则为真
expr1 -le expr2 : expr1<=expr2则为真
3.文件条件测试
-d file :文件为一目录则为真
-e file :文件存在则为真
-f file :文件为普通文件则为真
-g file :文件的set_group_id位被设置则为真
-u file :文件的set_user_id位被设置则为真
-s file :文件大小不为0则为真
-r file :文件可读则为真
-w file :文件可写则为真
-x file :文件可执行则为真
控制语句:
1.if语句:
if condition
then
statements
else
statements
fi
2.elif语句:
if condition
then
statements
elif condition1 ;then
statements
else
statements
fi
在if或者elif条件比较的时候最好把变量使用双引号包含在内,因为:
#!/bin/bash
echo "Is it morning ?Please answer yes or no"
read timeofday
if [ $timeofday = "yes" ]
then
echo "Good morning"
elif [ $timeofday = "no" ];then
echo "Good afternoon"
else
echo "Sorry,Enter yes or no"
exit 1
fi
exit 0
上面代码如果在运行到read时直接enter一下,那么就会将一个空字符串赋值给timeofday变量,就会出现错误,if语句会变成酱紫:
if [ = "yes" ]这样并不合法
为了避免这种情况我们在加上双引号,if语句就会是酱紫:
if [ ""="yes" ]这样是合法的
还有就是shell脚本的第一行总是有#!/bin/bash这样的代码,此代码表示使用指定的shell来解释此脚本
3.for语句:
for variable in values
do
statements
done
4.while语句:
while condition
do
statements
done
5.until语句:
until condition
do
statements
done
for、while、until:
#!/bin/bash
for foo in foo var 43
do
echo $foo
done
exit
输出结果为:
foo
var
43
#!/bin/bash
echo -n "Enter password: "
read password
while "$password"!="liuzigang"
do
echo -n "Error,once again:"
done
exit 0
当我们不知道循环次数的时候使用for就没有使用while方便
#!/bin/bash
echo -n "Enter password: "
read password
until "$password"="liuzigang"
do
echo -n "Error ,once again: "
done
exit 0
until语句和while语句的条件刚好反过来
6.case语句:case语句避免了多条件时比较撩眼的if嵌套
语法:
case variable in
pattern [ |pattren ...] statements;;
pattern [ |pattren ...] statements;;
...
esac
例如:
#!/bin/bash
echo "Is it moring,enter yes or no: "
read timeofday
case "$timeofday" in
[Yy]|[Yy][Ee][Ss]) echo "Good morning" ;;
[Nn]* ) echo "Good afternoon" ;;
* ) echo "Sorry";;
exit 0
后续....
小结:shell脚本,乍一看摸不到头脑,去图书馆借的书大多不适合入门,推荐linux程序设计第四版的第二章作为shell入门,通俗易懂。
不枉青春不虚此行——谢谢阅读,晚安