Linux Shell总结
所属分类 shell
浏览量 1305
变量
字母数字下划线,不能以数字开头
不能使用bash关键字
变量赋值=号两边不能有空格
变量使用引用
age=18
echo ${age}
name='dyyx'
echo "hello,${name}"
readonly 只读变量名
age=7
readonly age
age=8
报错
-bash: age: readonly variable
unset 删除变量,删除后不可用,不可删除只读变量
error='xxx'
unset error
LOGLEVEL=debug 和 export LOGLEVEL=debug 区别
前者只对当前进程有效,后者(环境变量)对子进程也有效
字符串
name="dyyx"
获取字符串长度 echo ${#name}
截取字符串 echo ${name:1:2}
yy
# 单引号原样输出
echo 'hello,${name}'
hello,${name}
echo "hello,${name}"
hello,dyyx
数组
只有一维数组,下标从0开始
arr=(v1 v2 v3 v4)
arr=('1' '2' '3')
arr[0]=3
获取数组元素 ${arr[n]},或取所有元素 ${arr[@]}
或取数组长度 ${#arr[*]} 或者 ${#arr[@]}
参数
sh xxx.sh
$0表示文件名
$1是第一个参数
$# 参数个数
$* 所有参数
$@ 所有参数
$? 上个命令或函数的返回值 , 一般成功返回0
$$ 当前Shell进程ID
$* 和 $@ 所有参数
被双引号包含时,"$*" 会将所有的参数作为一个整体
f=$0
echo $f
wd=`dirname $f`
echo $wd
wd=$(dirname $0)
echo $wd
cd `dirname $0`
echo `pwd`
获取脚本文件全路径和目录
fullpath=$(readlink -f $0)
echo "fullpath $fullpath "
workdir=$(dirname $(readlink -f $0))
echo "workdir:$workdir"
if [1==1];then
ehco 'true'
fi
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "xxx"
fi
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while condition
do
command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
条件测试
文件测试
逻辑测试
整数值比较
字符串比较
文件测试
-d 文件是否为目录类型
-e 文件是否存在
-f 是否为一般文件
-r 是否有权限读取
-w 是否有权限写入
-x 是否有权限执行
[ -d test.txt ]
[ -e test.txt ]
echo $?
存在返回0
echo $USER
[ $USER = admin ]
整数值比较
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 等于或小于
-ge 等于或大于
[ 10 -eq 10 ]
字符串比较
= 是否相同
!= 是否不同
-z 是否为空
[ $LANG != "en.US" ] && echo "Not en.US"
[ $LANG = "zh_CN.UTF-8" ] && echo "zh_CN.UTF-8"
流程控制语句
if for while case
DIR="/tmp/hello"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
DIR="/tmp/hello2"
if [ -e $DIR ]
then
echo "exist"
else
echo "not exist"
fi
inputcheck.sh
read -p "请输入一个字符" ch
case "$ch" in
[a-z] | [A-Z])
echo "输入的是 字母"
;;
[0-9])
echo "输入的是 数字"
;;
*)
echo "输入的是其他字符"
esac
for((i=1; i<=5; i++))
do
echo $i
done
for line in `cat hello.txt`
do
echo $line
done
score.sh
score=$1
if [ ${score} -lt 50 ]; then
echo "小于50"
elif [ ${score} -gt 50 ]; then
echo "大于50"
else
echo "等于50"
fi
echo "hello world"|cut -d " " -f 2
-d 指定分隔符
-f 返回字段下标 从1开始
function sayhello(){
echo "hello,$1"
}
sayhello "dyyx"
function showparam(){
num=$#
echo "paramnum=$num"
echo $*
#for((i=0;i<=$num;i++))
#do
# echo "param[$i]=$i"
#done
}
# paramnum=1
# "$*" 把参数作为一个整体 只有一个参数
showparam "$*"
# paramnum=3
showparam "$@"
# paramnum=3
showparam $*
# paramnum=3
showparam $@
echo `expr 2 + 3 `
# 乘号前加 \
echo `expr 2 \* 3 `
echo $[2+3]
echo $[2*3]
echo $((2+3))
echo $((2*3))
a=2
b=3
echo $[a+b]
echo $[a*b]
echo vs printf
echo 自动添加换行符
printf format-string [arguments...]
%s %c %d %f
d Decimal 十进制整数
s String 字符串
c Char 字符
f Float 数字型
printf "%-10s %-8s %-6d %-4.2f\n" tiger 男 9 66.1234
%-10s 宽度为10的字符串( - 左对齐,默认右对齐)
%-8.2f 宽度为8的字符串 .2指保留2位小数
printf "%10s %8s %6d %8.2f\n" tiger 男 9 66.1234
使用[[ … ]]条件判断结构,而不是[ … ]
比如 &&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
可以直接使用if [[ $a != 1 && $a != 2 ]]
如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ] 或者 if [ $a -ne 1 -a $a != 2 ]
上一篇
下一篇
spring-session-jdbc使用数据库存储共享session
shell里的浮点数运算
linux shell 获取进程相关信息
社会潜规则21条
增量方差java实现
智能手环原理