大家好:今天给大家介绍一下shell:
shell 本身是一个命令解释器,类似于python解释器,它可以解释Linux命令,我们可以把Linux命令写入shell脚本中,通过运行这个脚本,来执行一系列Linux命令。这就是shell编程。
由于历史原因shell有很多种,常用的shell 有sh、bash
查看shell种类: vim /etc/passwd #最后一列显示的是shell 的种类
shell注释: # 开头
Linux终端执行shell脚本实质是:shell会fork 一个子进程,并exec这个程序,执行完毕后会回到终端(内建命令不会创建新的进程,which查不到的命令,没有单独的man手册)
查看内建命令:man bash-builtins #内建命令不会创建新的进程,但是也有退出码(Exit Status) 0 表示成功,1表示失败
查看上一个程序的退出码:echo $?
注意:当写好shell 脚本后,怎样去执行呢?
方法一:chmod a+x test.sh #为脚本增加执行权限
./test.sh #执行脚本
方法二: /bin/sh test.sh #指定解释器 去 执行脚本 ,脚本名称作为解释器的参数 类似于用python 解释器去执行python脚本一样 ; python 脚本名
方法三:source test.sh 或者 . test.sh
如果在终端一次执行对个Linux 命令:
比如:(cd ..; ls-l) # 多个命令用分号隔开,会fork 一个子进程 运行结果不会影响到终端
cd .. ; ls -l # 多个命令分号隔开,会影响到终端
命名规范:由全大写字母加下划线组成。
环境变量:printenv 可以查看环境变量 环境变量可以从父进程传给子进程
本地变量:set 可以查看所有变量 包括本地变量和环境变量,变量定义等号两边不能有空格;
export 本地变量 #将本地变量导入环境变量。
unset 变量 #删除变量
所有的变量都是字符串
echo $SHELL #查看当前shell 类型
类似正则表达式去匹配文件名
* :0个或者多个任意字符
? :匹配一个任意字符
[a-z] :匹配 字符集中的任意一个字符的一次出现
将一个命令的结果赋值给另外一个变量
DATE=`date` 或 DATE=$(date)
VAR=45
echo $(($VAR+45)) #结果为90 等价于 echo $[$VAR+45]
$[base#n] :其中 base 表示进制, n表示按照base 进制解释
echo $[2#10+11] #以二进制去解释10 就是2,加上11 ,结果就是13
touch \$\ \$\ #创建 名为 \$\ \$\的文件
创建一_开头的文件: touch ./-hello 或者 touch -- -hello
续行: \ 后面敲回车
VAR=45
echo "$VAR" #结果为45
echo ‘$VAR‘ #结果为$VAR
VAR=2
test $VAR -gt 1 #结果为0 0 表示真,1 表示假
[ $VAR -gt 5 ] #结果为1
常见的测试:
[ -d DIR] #测试DIR是否为一个目录
[ -f FILE ] #测试FILE 是否为一个文件
[ -z STRING ] #测试STRING的长度是否为零
[ -n STRING ] #测试STRING 的长度是否非零
[ STRING1 = STRING2 ] #测试两个字符串是否相同
[ STRING1 != STRING2 ] #测试字符串是否不同
[ 变量1 OP 变量2 ] #OP可以为 -eq (等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)
!:逻辑非 ; -a:逻辑与 ;-o :逻辑或
if分支:
if [ -f ~/.bashrc ];then #如果条件成立 执行then 后面的语句 . ~/.bashrc fi
if -else分支:
if [ -f /bin/bash ] then echo "/bin/bash is a file" #语句分开写不用加分号 else echo "/bni/bash is NOT a file" #else分支 fi if :;then echo "alwalys true"; fi #多个语句写在一行要加分号 冒号表示总是真的,什么相当于True
if -else-if 分支:
echo "It is morning? Please answer yes or no." read YES_OR_NO #从屏幕中读取值存于变量中 if [ "$YES_OR_NO" = "yes" ];then echo "Good morning!" elif [ "$YES_OR_NO" = "no" ];then echo "Gooding afternoon!" else echo "Sorry, $YES_OR_NO not recognized. Enter yes or no." exit 1 #程序退出码 fi exit 0 #程序退出码
&& 相当于 if ..then 等价于 -a
|| 相当于 if not then 等价于-o
case分支:
#! /bin/sh echo "It is morning? Please answer yes or no." read YES_OR_NO case "$YES_OR_NO" in yes|y|Yes|YES) echo "Gooding Morning!";; [nN]*) echo "Gooding afternoon";; *) echo "Sorry, $YES_OR_NO not recognized. Enter yes or no." exit 1;; esac exit 0
while 循环:
echo "Enter password:" read TRY while [ "$TRY" != "secret" ];do echo "Sorry, try again" read TRY done
for 循环:
for FRUIT in apple banana pear;do echo "I like $FRUIT" done
原文:https://www.cnblogs.com/yanhonghong/p/11628419.html