目录
Shell
默认空格隔开
引号
“ ” 双引号 :引号里的内容当作整体来看,可以通过$引用其他变量值
echo "$(hostname)"
echo "$(touch haha)"
‘ ’ 单引号 :不能引用其他变量值,特殊符号会变成普通字符
echo '$(hostname)'
$(hostname)
` 反撇号 : $() ,如果存在嵌套反撇号就没用了
echo `hostname`
打印当前时间(date)
echo "$(date)"
echo "$(date +%Y-%m-%d)"
echo "$(date "+%Y-%m-%d %H:%M:%S“ )”
使用流程
#创建文件
touch qwe.sh (文件名.sh)
#写代码
vim qwe.sh
#!/bin/bash
#注释
:<<aa
多行注释
aa
str='hi' (定义一个变量)
echo $str
echo 'haha'
chmod 777 qwe.sh(赋予权限)
#执行
./qwe.sh
. 文件名(空格)
sh 文件名 (空格)
变量
aa=hihihihihi
echo $aa
echo ${aa:2:5}
#从第二个开始截取五个输出,从0开始
aa=`hostname`
echo $aa
只读变量
readonly 变量名
#被定义后,只能读,不能修改
返回字符串长度
qwe=hihihi
ecno $(#qwe)
#6
删除变量
unset aa
- 当前时间
vim time.sh
#!/bin/bash
t=$(date)
echo $t
chmod 777 time.sh
./time.sh
接受用户变量
read
read -p
#read -p'请输入' name
#echo $name
read -n
#定义字符数量
#read -n6
read -s
#不显示输入的内容
read -t
#定义输入时间,默认单位秒
#read -t6
定义有类型变量
declare
declare -i 变量名
整数
declare -r 变量名
只读
declare -a 变量名
普通数组(下标整数)
#可以一次赋值多个 下标从0开始
declare -a b=(1 2 3 4 5 6)
echo ${b[3]}
declare -A 变量名
关联数组(下标字符串)
#通过下标去赋值
declare -A b
b[a]=aaa
echo ${b[a]}
declare -x 变量名
通过环境导出
#env | grep 文件名
#查看当前用户环境变量
declare -x date=123
echo $date
123
内置函数
$? 上个命令执行后返回 0就是执行正常True
其他数字就是错误或者异常
$0 当前执行的程序或脚本名
#!/bin/bash #bash
$# 脚本后面的参数个数
# ./qwe.sh q w e r t y u i o p (传进去的参数)
#3
$* 脚本后面所有参数,当作一个整体
#q w e ...
$@ 参数独立,全部输出
#q
#w
#e
#...
$1-$9 脚本后面位置参数
#q ($1)
${10}-${n} 扩展位置参数
#${10}
#p
$$ 当前进程的进程号
$! 后台运行的最后一个进程号
!$ 调用最后一条命令历史中的参数
echo
转义
不换行 \c
echo -e"hihihi\c"
制表符 \t
echo -e"hihihi\thi"
换行 \n
echo -e"hihihi\nhi"
把结果写进文件 >
echo "hihi" > a.txt
四则运算
+ - * / %
*需要转义\*
$(()) echo $((v1+v2))
$[] echo $[v1+v2]
expr expr 6 + 6 #空格
let n=1;let n+=1 #分号隔开
判断
判断语法格式
test 条件
[ 条件 ]
[[ 条件 ]]
#在字符串里 = == 都是判断
a='hi'
b='hihi'
[[ $a = $b ]];echo $?
判断文件类型
-e 文件是否存在
test -e 文件名
-f 是否存在并且是个普通文件
-d 是否存在并且是个目录
-s 是否存在并且是一个非空文件
-L 是否存在并且是一个软连接文件
-b 是否存在并且是一个设备文件
-S 是否存在并且是一个套接字文件
-c 是否存在并且是一个字符设备文件
-p 是否存在并且是一个命名管道文件
判断文件权限
-r 当前用户对这个文件是否可读
test -r 文件名
-w 可写
-x 可执行
-u 是否有suid,高级权限冒险位
id -u #返回当前用户id
#管理员root id=0
-g 是否有sgid,高级权限强制位
id -g #返回当前用户组id
判断文件新旧
文件1 -nt 文件2 比较文件1是否比文件2新
文件1 -ot 文件2 比较文件1是否比文件2旧
文件1 -ef 文件2 比较是否位同一文件。
判断大小(整数)
-eq 相等 -ne 不等
-gt 大于 -ge 大于等于
-lt 小于 -le 小于等于
判断字符串
-z 是否为空字符串,字符串长度是0就行
test -z $str1
-n 是否为非空字符串,字符串长度不是0就行
$str1 = $str2
判断字符串是否相等
$str1 != $str2
是否不等
与或
-a && : and
#[1 -eq 1 -a 1 -ne 0]
#[1 -eq 1]&& echo "hihihi"
#[ $(id -u) -eq 0]&& echo "yes"
-o || : or
类c
((1==1));echo $?
((1!=1))
((1>=1))
((1<=1))
((a=666));echo $a
# = 赋值 ==判断
条件判断
if 语句
case 语句
if
if [ 条件1 ]
then
命令1
elif [ 条件2 ]
then
命令2
else
命令
fi
#空格 空格 空格 空格 空格 空格 空格 空格 空格 空格
if [条件];then 命令; fi #单行模式
case
语法结构:
case $变量 in
条件1)
命令1
;;
条件2)
命令2
;;
条件3)
命令3
;;
*)#else
默认命令
;;
esac
循环
for 循环
while 循环
until 循环
continue 继续:
#下面代码就不执行了,重头开始。
break 打断退出循环
exit 直接退出程序
for
for 变量
do
命令
done
后面传参
#./for1.sh 1 2 3 4
for 变量 in {list} #{1..n}
do
命令
done
{1..10..2} #1 3 5 7 9 每次执行+2
seq n #从1打印到n
seq 1 2 10 #1 3 5 7 9
for v in {1..10};do echo $v;done #命令行模式
i++ 先打印再+
++i 先+后打印
for((表达式1;表达式2;表达式3))
#((i=1;i<=10;i++))
#初始值;循环条件;迭代条件
do
命令 #循环体
done
while
循环语句:
i=1 #初始条件
while 表达式 #循环条件
do
命令 #循环体
let i++ #迭代条件
done
until
条件为假进入循环,条件为真的时候退出循环
i=1 #初始条件
until 表达式 #循环条件
do
命令 #循环体
let i++ #迭代
done
函数
方便重复使用
格式
function 函数名(){
命令
}
#!/bin/bash
function ft(){
read -p '输入数字' f
f=$[$f*$f]
echo $f
}
fun #调用函数
-------------------------------------
#!/bin/bash
function ft(){
f=$[$f*$f]
echo $f
}
read -p '输入数字1' a
read -p '输入数字2' b
f3 $a $b #= ./ft.sh 1 2
返回值
return 退出函数并返回一个值
#!/bin/bash
function fun(){
read -p '输入数字' f
f=$[$f*$f]
return $a
echo $? #可以理解为接受返回的东西
}
fun #调用函数
变量范围
默认是全局变量
local 变成局部变量
#!/bin/bash
function fun(){
read -p '输入数字' f
local f=$[$f*$f]
echo $f
}
echo $f #没东西输出
调用别的函数
source 路径
source ./fun.sh
source /home/tom/fun.sh #不同地方
#!/bin/bash
function fun(){
read -p '输入数字' f
local f=$[$f*$f]
echo $f
}