Shell-Bash语言-变量(上)

变量定义
a=1
b=seveniruby
d="hello from testrhome"
e='hello from "霍格沃兹测试学院"'

=左右不要有空格
如果内容有空格,需要使用单引号或者双引号
双引号支持转义$开头的变量会被自动替换
变量使用
echo $a
echo ${b}
echo "$a"

echo类似print
使用$var 或${var}来访问变量。后者更为严谨。$var_x${var}_x是不同的。
变量不需要定义也可以使用。引用未定义的变量,默认为空值。

#!/bin/bash
a=1
b=seveniruby
echo '$a'
echo "$a"
echo ${b}

运行结果如下:

预定义变量
echo $PWD:当前目录
echo $USER:当前是谁
echo $HOME:当前主目录
echo ~:当前主目录
echo $PATH
echo $RANDOM
运行结果如下:

变量类型
字符串 a='xx'
数字 i=1314
布尔 true false
数组 array=(a b c)
函数 foo(){echo hello world}
高于4.x的shell没有hash词典功能

数字型变量操作
计算
  i=1;echo $i;echo $((i+1))
更新
  ((i=i+1));echo $i
只能进行整数计算
浮点数计算请使用awk 'BEGIN{print 1/3}'
格式化显示可以使用awk 'BEGIN{printf("%.2f\n", 1/3)}'

字符串操作
取值
  ${value:offset}   ${value:offset:length}从变量中提取子串
  ${#value}字符串长度
  ${#array[*]}和${#array[@]}表示数组中元素的个数

x="hogwarts"
echo $x
echo ${#x}
echo ${x:3}
echo ${x:0:3}
echo ${x:1:3}

运行结果如下:

掐头去尾和内容替换
  ${value#pattern} ${value##pattern} #表示掐头
  ${value%pattern} ${value%%pattern} %表示去尾
  ${value/pattern/string} ${value//pattern/string} /表示替换
  #与## %与%% /与//的区别:最短匹配模式VS最长匹配模式
  ${var/#Pattern/Replacement} ${var/%Pattern/Replacement}

x="hogwarts"
echo ${x#*g}  #前面的是*,删到g
x="hogwarts from testerhome"
echo ${x#*t}
echo ${x##*t}

运行结果如下:

AWK可以替代这些操作,推荐使用AWK

x="hogwarts from testerhome"
echo $x | awk 'BEGIN{FS="t"}{print $1}'
echo $x | awk 'BEGIN{FS="t"}{print $2}'
echo $x | awk -F "r" '{print $1}'

运行结果如下:

布尔变量
true
false
命令执行返回值$?
  任何命令执行都会有一个返回值
  0表示正确
  非0表示错误
history | tail -10   查看最近的10条命令
echo $?    返回0,表示上一条命令正常执行

判断的类型
算术判断
[ 2 -eq 2 ] 相等
[ 2 -ne 2 ] 不等
[ 3 -gt 1 ] 大于
[ 3 -ge 3 ] 大于等于
[ 3 -lt 4 ] 小于
[ 3 -le 3 ] 小于等于
(())也可以表示算术比较。((10>8)),((10==10))

字符串判断

[ string1 = string2 ] 如果两字符串相同,则结果为真
[ string1 != string2 ] 如果两字符串不相同,则结果为真
[ -n "$var" ] 如果字符串不是空,则结果为真
[ -z "$var" ] 如果字符串是空,则结果为真
[[ "xxxx" == x* ]] 在表达式中表示0或者多个字符
[[ xxx == x?? ]] 在表达式中表示单个字符
在引用变量的时候要记得加双引号[-z "$a"]否则当a未定义时会语法报错
a=xxxx
b=xxx
[ "$a" == "$b" ]
逻辑判断

[ 2 -ge 1 -a 3 -ge 4 ];echo $? 与
[ 2 -ge 1 -o 3 -ge 4 ];echo $? 或
[[ 2 -ge 1 && 3 -ge 4 ]];echo $? 与
[[ 2 -ge 1 || 3 -ge 4 ]];echo $? 或
[ !2 -ge 1 ];echo $? 非

shell内置判断

-e file 如果文件存在,则结果为真
-d file 如果文件是一个子目录,则结果为真
-f file 如果文件是一个普通文件,则结果为真
-r file 如果文件可读,则结果为真
-s file 如果文件的长度不是0,则结果为真
-w file 如果文件可写,则结果为真
-x file 如果文件可执行,则结果为真
[[]]是[]的扩展语法,在老的sh里并不支持。推荐用[]

猜你喜欢

转载自www.cnblogs.com/peiya/p/12584424.html