Linux Shell总结  
   
所属分类 shell
浏览量 1736
变量
字母数字下划线,不能以数字开头
不能使用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实现 
 智能手环原理