shell
用户登录linux后,就会出现一个系统提示符号,这个就是shell,当用户登录后,实际上是进入到一个叫shell的程序中,shell的角色就是将用户输入的每个命令都翻译成linux系统能识别的指令;
当shell接收到用户输入的命令后,就会开始执行,并把结果显示到屏幕上,结束后shell又会显示系统提示符,等待用户输入下一条指令;
shell基础
shell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。
echo $SHELL ;查看当前使用的shell
cd /etc/shells ;查看操作系统所有的shell
chmod 777 text.txt ;修改文件权限
chown systemk1t.systemk1t test.txt ;修改文件所属组
chgrp root test.txt ;修改用户组
umask 0000 ;修改掩码
shell脚本
shell文件以.sh结尾,并且写完的shell要给执行权限
#!/bin/bash
mytext="sYstemk1t"
echo $mytext
定义变量前后不可存在空格,加空格shell解析不了
shell特性
- 双引号(“”):用来使shell无法认出空格、制表符和其他大多数特殊字符,比如:建立一个带空格的文件touch “wang bao ming”。
- 单引号(‘):用来使shell无法认出所有特殊字符。
- 反引号(`):用来替换命令
- 反斜杠():用来使shell无法认出的特殊字符,使其后的字符失去了特殊的含义,转义字符。eg:创建带空格文件名 touch my\ file
- 分号(😉:允许在一行上放多个命令。mv 1.txt 2.txt; mv 2.txt 3.txt;
- &:命令后台执行
- 括号():创建成组的命令
- 大括号{}:创建命令块。
- 竖杠(|):管道标示符
- < > &:重定向表示符
-
- ? [ ] !:表示模式匹配
- $:变量名的开头
- #:表示注释(第一行除外)
- 空格、制表符、换行符:当做空白
变量与运算符
变量
变量包括本地变量、影响变量的命令、环境变量、引号、变量替换、运算符、位置变量、表达式变量、标准shell变量、运算符的优先级、特殊变量
引号
引号的必要性、双引号、单引号、反引号、反斜杠
-
引号的必要性
-
变量和替换操作,在脚本中执行变量替换时,最容易犯的一个错误就是引号的错误。
-
例如:echo aa.tar.gz * ; echo “aa.tar.gz *” 效果大不一样
-
双引号 使用双引号可以引用除字符$,`反引号,\反斜杠外的任意字符或者字符串。
shell echo -e " hello world, $SHELL '\n* sYstemk1t 'echo $myvar' "
-
单引号 单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符。
shell echo -e ' hello world, $SHELL '\n* sYstemk1t '
-
结论:单引号让特殊字符失去意义。
-
反引号 反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并执行其内容。
-
eg:echo “* wangbaoming
echo $PATH
” -
反斜杠
-
如果一个字符有特殊含义,反斜杠防止shell误解其含义,即:屏蔽其特殊含义。
-
下属字符含有特殊含义:$ * + ^ ` ‘’ | ?
-
eg:echo * echo *
表达式类型
- 按位运算符
- ~op1 反运算符
- op1<<op2 左移运算符
- op1>>op2 右移运算符
- op1 & op2 与比较运算符
- op1 ^ op2 异或运算符
- op1 | op2 或运算符
- eg: echo $[2<<4] echo $[2^4]
- $[ ] 表示形式告诉shell对方括号中的表达式求值
- eg: echo $[3+9]
- 逻辑运算符
- && 逻辑与运算
- || 逻辑或运算符 echo $[1||1]
- 赋值运算符
- =,+=,-=,*=,/=,%=,&=,^=、|=,<<=,>>=
- let count = $count + $change
- let count += $change
控制流
if-else
#!/bin/sh
echo -n "Enter input you filename:"
read myfile
if [ -e $myfile ]
then
if [ -s $myfile]
then
echo "$myfile exist and size greater than zero"
else
echo "$myfile ecist buf size is zero"
fi
else
echo "file no exist"
fi
case
#!/bin/sh
echo -n "Enter input you number from 1 to 3:"
read num
case $num in
1)
echo "you select 1"
;;
2)
echo "you select 2"
;;
3)
echo "you select 3"
;;
y|Y)
echo "you select y"
;;
*)
echo "`basename $0`:this is between 1 and 3">$2
exit;
;;
esac
for
#!/bin/sh
for i in 1,2,3,4,5
do
echo $i
done
until
#!/bin/sh
PART="/backup"
LOOK_OUT=`df | grep "$PART" | awk`{printf $5}`| sed 's/%//g'`
echo $LOOK_OUT
until [ "$Look_Out" -gt "90" ]
do
echo -e "Filesystem $PART is near full" | mail root
LOOK_OUT=`df | grep "$Part" | awk '{printf $5}' | sed 's/%//g' `
sleep 3600
done
while
#!/bin/sh
echo "ctrl+d quit"
while echo -n "Enter you name:"
read Name
do
echo "Yeah,you name is : $Name"
done
条件测试
文件
test -d 文件名
echo $?