初步探索Linux(2)
一、Shell
1.bash的切换
bash是linux默认的shell,sh是unix默认的.使用/bin/bash临时切换,永久切换chsh,另外使用chsh -l 是查看.
2.bash的特点
(1)交互式
(2)命令的历史功能
(3)命令的补齐功能 tab有一次和两次之分
(4)通配符 * 任意字符
?匹配一个字符 .
[n-m]
(5) 前后台切换 ps -aux 查看进程 wc -l 查看结果的数目
将前台运行的任务暂停 ctrl +z 查看后台的任务 jobs之后 ,bg 1(号码)这样就可以后台 fg 表示前台
(6).特殊字符 ""强引用``(位于esc) 命令的取代 '' 表示弱引用 ,
(7).输入输出的重定向
0 标准的输入 1 标准的输出
2 标准的出错 & 所有的输出
例如:find / -size +10M 2>(2>出错的重定向) f1
(8).命令的别名 自己做一个别名 alias
alias find10 ='/bin/.....' 使用 unalias 可以取消
想要永久生效的话就需要修改文件/etc/baskrc 将其添加进去就可以了.
二、环境变量
可以使用set来查看变量。
1.变量的分类
(1)本地变量
A(字母数字,特殊字符)这是针对当前的shell生效.
(2)环境变量
export 这样就可以将本地变量输入,就可以成为环境变量.export A就可以了
(3).特殊变量
a位置变量
例如写一个文件
#!/bin/bash
echo $1 $2 $3 $0(该脚本的名称) 之后就可以使用 bash 1.sh 输入a b c
b状态变量
例如echo $?这样可以查看上一个命令是否执行成功0表示成功
2.环境文件
(1)系统文件 针对所有用户生效 /etc/profile(变量如hostname) /etc/bashrc (alias等)
(2)个人
~ /.bash_profile ~/bashrc
三、运算
1.算术运算
(1)let 例如let a=`1+2` ;echo $a
(2)$[] 例如a=$[1+2] ;echo $a
(3)$(()) 例如a=$((1+3)) echo $a
(4)bc 例如echo "scale=3;4/7" |bc,其中6/7想要实现精度 ,加上 scale=2才可以
2.判断式
(1)数字比较
大于 -gt 大于等于 -ge 小于 -lt 小于等于 -le 等于 -eq
不等于 ! -eq (如[ ! 5 -eq 2 ])
(2)字符串比较
大于 > 小于 < 等于 = (等号两侧有空格)恒等于 == (类型)
例如,a=hello; b=hello1; [ $a \> $b ]这样就可以进行比较字符串了,但是不要忘记转义符.另外如果使用两对[]就不用添加转义符.如[[ !$a < $b ]]
(3)对象
-f 文件 [ -f f1 ] -e 存在 [ -e f1 ] -d 目录
-L 链接 -r 读取 -x 执行
(4)其它
对于判断也可以使用联合的方法.
-a 与 (两个判断式)如 [ -e f1 -a -f f1 ]
-o 或
另外,也可以使用,短路操作符 &&(两个语句)||
例如,[ -e f1 -a -f f1 ]
grep "^user1\>" /etc/passwd &>/abx/f122 && echo "the account is exists!"
四、正则表达式
元字符
^ 行首 $行尾 词首 \< 词尾 \> . 任意的一个字符
* 匹配任意次 0--n \{n,m\} \{n,\} \{,m\}
如grep --color=auto "r\{n,m\}o" f11 | less
grep --color=auto "[1-9]"f11 | less
帐号管理例子编写
#/bin/bash
read -p "please input one account"(read表示输出)
grep "^ $ACCOUNT\>" /etc/passwd &> /ba/f1111 && echo "the $ACCOUNT is
exists!" || echo "ok!"
可以使用echo -e 扩展 echo -e "\t\033[31m123\033[0m"(其中123是想要输出 颜色的)echo "123"
五、程序语句
1.控制语句
判断语句可以分为
a单选 if [ 条件 ];then...else ..... fi
if [ 条件 ];then .... fi
b多选 if [ 条件 ];then ... Elif[ 条件 ];then ...elif [];then ... Fi
例子: (主要让用户输入文件和其根目录,判断文件的属性)
#!/bin/bash
read -p "please input the file you want" FILE
read -p "please input the dir you want" DIR
if [-e $DIR/$FILE ];then
if [-f $DIR/$FILE ];then
echo "the $DIR/$FILE is a file "
elif [-d $DIR/$FILE ]";then
echo "the $DIR/$FILE is a dir "
elif [-L $DIR/$FILE ]";then
echo "the $DIR/$FILE is a Link "
fi
else
echo "the $DIR/$FILE is not exists!"
fi
(如果出错可以添加调试开关 set -x)
c case语句(相当于高级语言中的switch语句)
case 变量 in
变量值1)
.....;;
变量值2)
....;;
变量值3)
....;;
*)
...;;
exac
例子:(主要让用户输入文件名和路径,进行判断其类型)
(补充:STRING= - ABC
echo ${STRING:0:1}(0表示起始列,1表示取1列))
#!/bin/bash
read -p "Please input one file" FILE
read -p "Please input one dir" DIR
if [ -e $DIR/$FILE ];then
STRING=`/bin/ls -l -d $DIR/$FILE`
FIRSTCHAR=`echo "${STRING:0:1}`
case $FIRSTCHAR in
-)
echo "The $DIR/$FILE is a file";;
d)
echo "The $DIR/$FILE is a dir;;
l)
echo "The $DIR/$FILE is a link";
b)
echo "The $DIR/$FILE is a boot device";
f)
echo "The $DIR/$FILE is a floppy";
c)
echo "The $DIR/$FILE is a char device";
*)
exit
echo "Sorry!There is a problem in this system!"
else
echo"Sorry!the $DIR/$FILE is not exist!"
esac
2.循环语句
(1).for循环
for 变量 in 变量的值 ;do
.......
done
例如
#!/bin/bash
I=1
SUM=0
for I in {1..100};do
let SUM=$SUM+$I
done
echo $SUM
(2).While循环
while 【条件】;do
....
done
(3).while read LINE循环
while read LINE;do
......
done <文件名
例子:(将所有帐号读取,并进行排序)
#!/bin/bash
let I=1
while read LINE;do
echo - e "$I:\t"$LINE
let I=$I+1
done </etc/passwd
3.其它语句
until语句
until [条件];
do
.....
done
只不过条件是不满足,就执行,一旦条件满足就不执行.