1 在命令行中和脚本 中,
变量定义得格式:
name=value //=左右两边不能有空格,否则会当做命令来对待,输出一个command not found
echo $name //echo 打印出变量,引用变量使用$name.
2 单引号和双引号 语法 和php中相同:
双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。
如:
myname="$name is me"
echo $myname
Jack is me.
myname='$name is me'
echo $myname
$name is me
3 查看环境变量 ,mysql和shell有类似的功能。
env //查看环境变量
set //查看局部变量和环境变量
export $name //将局部变量导入为环境变量。
4 交互式设置变量的值
read [-pt] name //具体选项可查看帮助
:hello world //用户的输入
echo $name
hello world
declare [-aixr] name //声明变量得类型
sum=100+300+50
echo $name
100+300+50
declare -i sum=100+50+30
echo $sum
180
5 引用 数组变量
就假设使用read得到的数组
read -p "input the Array" arr
: hello world //用户输入
echo $arr[0]
hello[0] //输出错误,不能这样调用数组变量。
正确调用数组变量得方式 :
echo $(arr[1]) //小括号,让其接合起来。
顺便提及在${} //{}大括号中放置command ,${}将其返回值取出来。
6 引用${}对变量的操作 表:
file=/dir1/dir2/dir3/my.file.txt
我们可以用${}分别替换获得不同的值:
${file#*/}:从变量file的字符串左边开始,删除字符直到第一个“/”:dir1/dir2/dir3/my.file.txt
${file##*/}:从变量file的字符串左边开始,删除字符直到最后一个“/”:my.file.txt
${file#*.}:从变量file的字符串左边开始,删除字符直到第一个“.”:file.txt
${file##*.}:从变量file的字符串左边开始,删除字符直到最后一个“.”:txt
其实,在“#”后面,无非就是一个匹配问题(是linux中通用的通配符) ,不限于两个,你可以放任意个字符,还可以用shell中另外的通配符“?”“[…]”“[!…]”, 例如:
$echo${file#????}
1/dir2/dir3/my.file.txt
$echo${file#*[0-9]}
/dir2/dir3/my.file.txt
$echo${file#/dir1/dir[0-9]}
/dir3/my.file.txt
上面是从头往后匹配,下面分别是从后往前匹配 ,和替换:
至于“%”,和“#”不同的地方,就是从变量字串右部开始。
${file%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“/”:/dir1/dir2/dir3
${file%%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“/”:(空值)
${file%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“.”:/dir1/dir2/dir3/my.file
${file%%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“.”:/dir1/dir2/dir3/my
替换:
${变量/旧字符串/新字符串} //只替换第一个匹配上的
${变量//旧字符串/新字符串} //替换所有匹配上得,是
7 万用字符和特殊符号
符号 | 内容 |
* | 万用字符,代表一个或多个字符(或数字) |
? | 万用字符,代表一个字母 |
# | 批注,这个最常被使用在 script 当中,视为说明! |
\ | 跳脱符号,将『特殊字符或万用字符』还原成一般字符 |
| | 分隔两个管线命令的界定 ; |
; | 连续性命令的界定(注意!与管线命令并不相同) |
~ | 使用者的家目录 |
$ | 亦即是变量之前需要加的变量取代值 |
& | 将指令变成背景下工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 路径分隔的符号 |
>, >> | 输出导向,分别是『取代』与『累加』 |
' | 单引号,不具有变量置换的功能 |
" | 具有变量置换的功能! |
` ` | 两个『 ` 』中间为可以先执行的指令! |
( ) | 在中间为子 shell 的起始与结束 |
[ ] | 在中间为字符的组合 |
{ } | 在中间为命令区块的组合! |