Shell变量(二)

原文来自:[url]http://www.runoob.com/linux/linux-shell-variable.html[/url]
本着学习的态度,边学边记录。

[size=large]Shell变量[/size]
[size=large]定义变量时[/size],变量名不加美元符号($,PHP语言中变量需要),如:
your_name="runoob.com"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
(1)命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
(2)中间不能有空格,可以使用下划线(_)。
(3)不能使用标点符号。
(4)不能使用bash里的关键字(可用help命令查看保留关键字)。
有效的Shell变量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_VAR
var2

无效的变量命名:
?var=123
user*name=runoob

除了显示地直接赋值,还可以用语句给变量赋值,如:
for file in 'ls /etc'

for file in $(ls /etc)
以上语句将/etc 下目录的文件名循环出来。
[size=large]使用变量
[/size]
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java;do
echo "I am good at ${skill}Script"
done

输出结果:
I am good at AdaScript
I am good at CoffeScript
I am good at ActionScript
I am good at JavaScript

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
不加花括号的结果:
I am good at 
I am good at
I am good at
I am good at

[size=large][color=red]推荐给所有变量加上花括号[/color][/size],这是个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",[size=large][color=red]使用变量的时候才加美元符($)[/color][/size]

[size=large]只读变量[/size]
使用readonly命令可以将变量[size=large][color=red]定义[/color][/size]为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
运行脚本,结果如下
/bin/sh:NAME:This variable is read only.

[size=large][color=red]注意点:定义只读变量,不是使用变量,不要用$符号[/color][/size]

[size=large]删除变量[/size]
使用unset命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用。unset命令不能删除只读变量

实例:
apple="red"
echo ${apple}
unset apple
apple="yellow"
echo ${apple}

注意这个是反例,删除apple之后,再次定义了apple变量所以会输出red yellow
这个删除之后不能再次使用,是没有重新定义的情况下,注意是删除后不能再次使用,删除后如果再定义了同一个变量,那还是能使用。
正例:
#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl

以上实例执行将没有任何输出

[size=large]变量类型[/size]
运行shell时,会同时存在三种变量:
1)局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2)环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3)shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

[size=x-large]Shell字符串[/size]
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
[size=large]单引号[/size]
str=‘this is a String’
单引号字符串的限制:
单引号里的任何字符串都会原样输出,[size=large][color=red]单引号字符串中的变量是无效的[/color][/size];
单引号字符串中[size=large][color=red]不能出现单独一个的单引号[/color][/size](对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用

[size=large]双引号[/size]
your_name='runoob'
str="Hello,I konw you are \"$your_name\" ! "
echo ${str}

输出结果为:
Hello,I know you are "runoob"!

双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

[size=large]拼接字符串[/size]

your_name="runoob"

#使用双引号拼接

greeting="hello,"$your_name" !"
greeting_1="hello,${your_name} !"
echo $greeting $greeting_1

运行结果:

hello,runoob! hello,runoob !

双引号中可以有变量
#使用单引号拼接

greeting_2='hello,'$your_name' !'
greeting_3='hello,${your_name} !'
echo $greeting_2 $greeting_3

运行结果

hello,runoob! hello,$your_name !

单引号中出现的字符都会原样输出,单引号中出现成对的单引号可以用来字符串拼接。

[size=large]获取字符串长度[/size]

string="abcd"
echo ${#string} #输出4

[size=x-large][color=blue]注意#这个取字符长度[/color][/size]

[size=large]提取子字符串[/size]
以下实例从字符串第2个字符开始截取4个字符:

string="runnoob is a great site"
echo ${string:1:4} # 输出unoo


[size=large]查找子字符串[/size]
查找字符i或o的位置(哪个字母先出现就计算哪个);
string="runoob is a great site"
echo `expr index "$string" io` #输出4
注意:以上脚本中`是反引号,而不是单引号`,不要看错了哦。

[size=large]Shell数组[/size]
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)

或者
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。

[size=large]读取数组[/size]
读取数组元素值得一般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

[size=large]获取字符串长度[/size]
获取数组长度的方法与获取字符串长度的方法相同,例如:
#获取数组元素的个数
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得数组单个元素的长度
lengthn=${#array_name[n]}

[size=large]Shell 注释[/size]
以"#"开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号。只能像这样:
#--------------------------------------
#这是一个注释
#author:菜鸟教程
#site:www.runoob.com
#slogan:学的不仅是技术,更是梦想!
#------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束 #####

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

多行注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF也可以使用其他符号
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!


[size=large]练习命令:[/size]

#!/bin/bash
# your_name="fadskfds"
# ta_name="dd"
#echo ${your_name}${ta_name}
#echo $your_name$ta_name

#for skill in Ada Coffe Action Java;do
# echo "I am good at $skillScript"
# done
#your_name="jbx"
#echo ${your_name}

#apple="red"
#echo ${apple}
#unset apple
#apple="yellow"
#echo ${apple}

#myUrl="http://www.runoob.com"
#unset myUrl
#echo $myUrl
#A="1"
#B="2"
#C="3"
#for i in $A $B $C; do echo $i; done
#help for
#str='this is a String'
#echo ${str}
#str='this is a 'dddd' system'
#echo ${str}

#your_name='runoob'
#str="Hello,I konw you are \"$your_name\"! \n"
#echo $str
#echo -e "OK! \n" # -e 开启转义
#echo "It it a test"

#your_name="runoob"
#greeting="hello,"$your_name"!"
#greeting_1="hello,${your_name} !"
#echo $greeting $greeting_1

#greeting_2='hello,'$your_name'!'
#greeting_3='hello,$your_name !'
#echo $greeting_2 $greeting_3

#string="abcd"
#echo ${#string} #输出结果4
#echo ${string:1:3} #输出bcd
string="runoob is a great site"
echo `expr index "$string" io` #输出4 o的位置是4 从1开始的
array=("a" "b" "c")
arr=(
1
2
3
)
echo ${array[@]} #输出 a b c
echo ${arr[@]} #输出1 2 3

echo ${#array[*]} #输出3
echo ${#array[1]} #输出1

#输入help
help
#输出
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

job_spec [&] history [-c] [-d offset] [n] or hist>
(( expression )) if COMMANDS; then COMMANDS; [ elif C>
. filename [arguments] jobs [-lnprs] [jobspec ...] or jobs >
: kill [-s sigspec | -n signum | -sigs>
[ arg... ] let arg [arg ...]
[[ expression ]] local [option] name[=value] ...
alias [-p] [name[=value] ... ] logout [n]
bg [job_spec ...] mapfile [-d delim] [-n count] [-O or>
bind [-lpsvPSVX] [-m keymap] [-f file> popd [-n] [+N | -N]
break [n] printf [-v var] format [arguments]
builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
caller [expr] pwd [-LP]
case WORD in [PATTERN [| PATTERN]...)> read [-ers] [-a array] [-d delim] [->
cd [-L|[-P [-e]] [-@]] [dir] readarray [-n count] [-O origin] [-s>
command [-pVv] command [arg ...] readonly [-aAf] [name[=value] ...] o>
compgen [-abcdefgjksuv] [-o option] [> return [n]
complete [-abcdefgjksuv] [-pr] [-DE] > select NAME [in WORDS ... ;] do COMM>
compopt [-o|+o option] [-DE] [name ..> set [-abefhkmnptuvxBCHP] [-o option->
continue [n] shift [n]
coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...]
declare [-aAfFgilnrtux] [-p] [name[=v> source filename [arguments]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ... | pid > test [expr]
echo [-neE] [arg ...] time [-p] pipeline
enable [-a] [-dnps] [-f filename] [na> times
eval [arg ...] trap [-lp] [[arg] signal_spec ...]
exec [-cl] [-a name] [command [argume> true
exit [n] type [-afptP] name [name ...]
export [-fn] [name[=value] ...] or ex> typeset [-aAfFgilnrtux] [-p] name[=v>
false ulimit [-SHabcdefiklmnpqrstuvxPT] [l>
fc [-e ename] [-lnr] [first] [last] o> umask [-p] [-S] [mode]
fg [job_spec] unalias [-a] name [name ...]
for NAME [in WORDS ... ] ; do COMMAND> unset [-f] [-v] [-n] [name ...]
for (( exp1; exp2; exp3 )); do COMMAN> until COMMANDS; do COMMANDS; done
function name { COMMANDS ; } or name > variables - Names and meanings of so>
getopts optstring name [arg] wait [-n] [id ...]
hash [-lr] [-p pathname] [-dt] [name > while COMMANDS; do COMMANDS; done
help [-dms] [pattern ...] { COMMANDS ; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值