shell变量
定义变量
变量名命名规则:
1.命名只能使用英文字母、数字和下划线,首个字符不能以数字开头
2.中间不能有空格,可以使用下划线
3.不能使用标点符号
4.不能使用sh中的关键字,可用help查看保留字
定义变量时"="两边不能有空格a=1, _a=1, a_1=1
显式直接赋值:a=1,a_=2
用语句赋值:for file in `ls /etc`,for file in $(ls /etc)
# ` ` 和 $() 等价
for file in $(ls /Users/csj/Desktop);do
echo ${file}
done
使用变量
在变量前面加上$即可引用变量,$b,对于变量名较长的变量,可使用花括号,${ab_0ui},推荐给所有变量加上花括号
#shell
#!/bin/bash
your_name="hello world"
echo $your_name
echo ${your_name}
hello world
hello world
已定义的变量可以重新定义
#!/bin/bash
your_name="hello world"
echo ${your_name}
your_name="hello java"
echo ${your_name}
hello world
hello java
#!/bin/bash
your_name="hello world"
for i in ${your_name};do
echo "this is $i"
done
this is hello
this is world
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
your_name="hello world"
echo ${your_name}
readonly your_name
your_name="hello java"
echo ${your_name}
hello world
test.sh: line 5: your_name: readonly variable
删除变量
使用unset可以删除变量
#shell
#!/bin/bash
your_name="hello world"
unset your_name
echo ${your_name}
运行脚本,将不会有任何输出
变量类型
- 局部变量:在脚本或命令中定义,尽在当前shell实例中有效,其他shell启动的程序不能访问局部变量
- 环境变量:所有的程序,包括shell启动的程序,都能访问变量。有些程序需要环境变量来保证其正常运行
- shell变量:shell变量是由shell程序设置的特殊变量。有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
shell字符串
单引号
单引号字符串的限制:
1.单引号的任何字符串都会原样输出,单引号字符串中的变量是无效的;
2.单引号字符串中不能出现单独一个的单引号,对单引号使用转译符也不行
#!/usr/bin/sh
#单引号内可以添加转译符、双引号
your_name='hello world'
echo '可以单引号中变量无效:${your_name}'
echo '可以单个双引号:hello"'
echo '可以成对的双引号:h"e"llo'
echo '多个用于拼接字符串:''hello''wrold'
echo '可以使用转译符:\thello\nworld'
echo '不能使用单独的单引号:\'hello'
可以单引号中变量无效:${your_name}*
可以单个双引号:hello"*
可以成对的双引号:h"e"llo*
多个用于拼接字符串:hellowrold*
可以使用转译符: hello*
world*
test.sh: line 12: unexpected EOF while looking for matching `''
test.sh: line 13: syntax error: unexpected end of file
双引号
双引号的优点:
1.双引号里可以有变量
2.双引号里可以出现针对双引号进行转译
#shell
#!/usr/bin/sh
your_name="Tom Cat"
echo ${your_name}
echo "hello \"${your_name}\""
Tom Cat
hello "Tom Cat"
拼接字符串
#shell
#!/usr/bin/sh
your_name="Tom Cat"
#使用双引号进行拼接,变量在双引号内部,变量在双引号外面
hello1="hello,"$your_name"!"
hello2="hello,${your_name}!"
echo hello1 hello2
#使用单引号,变量在单引号内部,变量在单引号外面
hello3='hello,'$your_name'!'
hello4='hello,${your_name}!'
echo hello3 hello4
hello1 hello2
hello3 hello4
获取字符串长度 ${#string}
#shell
#!/usr/bin/sh
your_name="Tom Cat"
echo ${#your_name} #7
提取子字符串 ${string:start:length}
#shell
#!/usr/bin/sh
your_name="abcdefghijklmnopqrstuvwxyz"
echo ${your_name:3:4} # defg
查找子字符串 expr index "${string}" substring
#shell
#!/bin/sh
string="hello world"
echo `expr index "$string" o`
mac没有执行成功
expr: syntax error
字符串截取
#号截取,删除左起第一个及左边的字符,保留右边字符
##号截取,删除左起最后一个及左边的字符,保留右边字符
%号截取,删除右起第一个及右边的字符,保留左边字符
%%号截取,删除右起最后一个及右边的字符,保留左边字符
${str:start:length}从左起第几个字符开始,及截取字符的个数
${str:start}从左起第几个字符开始,一直到结束
${str:0-start:length}从右边第几个字符开始,及字符的个数
${str:0-start}从右边第几个字符开始,一直到结束
#shell
#!/bin/sh
str='Hello World'
echo $str
echo ${str#*o}
echo ${str##*o}
echo ${str%o}
echo ${str%%o}
echo ${str:2:3}
echo ${str:3}
echo ${str:0-5:3}
echo ${str:0-3}
Hello World
World
rld
Hello World
Hello World
llo
lo World
Wor
rld