近段时间在学linux 下shell编程总结一下
1、基本格式
#!/bin/bash
这里写你的代码
我们写一个shell脚本不可能只在一台机器上面运行,为了方便
我们就加了 #!/bin/bash 这一句话。其中 #! 符号成为“Sha-bang”
符号是shell脚本的起始符号,它指定一个文件类型的特殊标记。它告诉操作系统这个文件执行需要一个解释器 后面的路径就是指定了解释器为bash 当然也可以是sh
#!/bin/bash
#!/bin/sh 都是对的
2、简单的执行
在linux 中一个文件想要被执行首先需要有执行权限
可以用 chmod 777 文件名 来改
这里说一下文件的权限
我们执行 ls -l 如图
第一个字符 表明了文件的类型 -表示文件 d表示目录 l表示链接
r读4
w写2
x可执行1
所有者
所在组
其他组
表示用户
表示用户所在组
文件大小
最后修改日期
文件名
我们改为777表示任用户都可以去执行他
或者
bash ./文件 也可以直接去执行
3、变量以及引用
众所周知变量就是用来保存有用的信息的
Shell是一种弱类型语言,使用变量的时候无需首先声明其类型。
var = "world"
echo "hello $var"
会输出hello world
$表明一个变量 也可以用一个大括号来表示 ${}
var = "world"
echo "hello $vars"
输出 hello 而不是 hello worlds (注意后面有个s) 因为系统将 $vars 当作一个变量了
而$vars并未赋值为空
所以出现了混淆的情况 可以用 ${}代替
var = "world"
echo "hello ${var}s"
就会输出 hello worlds
------------------------------------------
环境变量
ENVIRON-VARIABLE=value #环境变量赋值
export ENVIRON-VARIABLE #声明环境变量
unset ENVIRON-VARIABLE 清除环境变量
env 命令列出系统所有环境变量
列举一些比较重要的环境变量
PWD 记录当前的目录路径
OLDPWD 记录旧的目录路经
HOME 记录当前以后家目录
SHELL 保存默认的shell
PPID 当前进程的父进程号
位置参数
是一种特殊的Shell变量,用于想shell脚本传递参数
$0 表示脚本的名字
$1 表示第一个参数
$2 表示第二个参数。。。
从${10}开始都用打括号表示
....
$# 表示传递的参数个数
$$ 脚本运行进程号
$@/$* 表示所有参数
$? 表示命令推出的状态 ()
引用
我们通常将单引号的引用方式称为全引用,双引号为部分引用
命令替换
`linux 命令`
$(linux命令)
位运算
是在二进制基础上进行的运算
<< 想左位移 相当与乘于2
4<<2 =16
>> 向右移 相当与除以2
8 >> 2 =4
3&1 按位与
3 0000 0011
1 0000 0001
与后 0000 0001
3&1 = 1
按位或、按位非、按位异或同理
4、退出、测试、判断
退出
当命令执行完后系统会返回一个退出状态
存储在$?中
测试
可用来用于测试表达式的条件的真假
真则返回一个0,假时返回一个非0整数
test 或 [ ]
注意空格 [空格 内容 空格]
简单if语句
if 条件
then
命令..
fi
或
if 条件
then
命令..
elfi 条件
then
命令
else
命令
fi
case结构
case 变量 in
值1)
命令;;
值2)
命令;;
*)
命令;;
esac
for循环
#!/bin/bash
for i in 1 2 3 4 5
do
echo "hello $i"
done
#还可以
for i in {1..5}
do
echo "haha $i"
done
echo "计算奇数之和先输入一位数"
read val
sum=0
for i in {1..100..2}
do
let "sum+=i"
done
echo "结果为 $sum"
for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday
do
echo "$day"
done
echo "还可以列出所有文件"
for f in $(ls)
do
echo "$f"
done
while循环
#!/bin/bash
echo "标志控制的while循环猜字游戏"
echo "输入一个数字(1-10)"
read val
single=1
while test $single -ne 0
do
if test $val -gt 5
then
single=1
echo "Too Big"
read val
elif test $val -lt 5
then
single=1
echo "Too Smali"
read val
else
echo "You are right"
single=0
fi
done
正则
* 0个或多个在×字符之前的那个普通字符
. 匹配任意字符
^ 以后面的字符开头或屏蔽后面的字符
$ 匹配行尾
[] 匹配字符集合
\ 转义字符屏蔽一个元字符的特殊意义
\<\> 精确匹配符号
\{n\} 前面的字符出现n次
\{n.\}前面的字符至少出现n次
\{n,m\}前面的字符至少出现n次至多出现m次
? 匹配0个体或1个在其之前的那个字符
+ 匹配1个或多个
() 表示一个字符集合或用在expr中
| 表示 或 匹配一组可选的字符
^$ 匹配空行