变量的声明
1、定义变量时不加$,使用时要加$,用以区别字符串,变量名用{}括来是个好习惯,shell会将花括号里面的字符解释为一个整体,后面将数组的时候会体现。
[root@php.svn-server ~]
# var1=q
[root@php.svn-server ~]
# echo "$var1"
q
[root@php.svn-server ~]
# echo ${var1}a
qa
用${变量名}的方式后面可以直接跟字符、则使用echo $var1 或 echo $var1 则会解析不出来变量。
${}方式可以在{}里面可以看做一个表达式。
例如:
[root@php.svn-server ~]
# var=qidong
[root@php.svn-server ~]
# echo ${var#qi}
dong
不要在等号两边加上空格,否则将会报错!
[root@php.svn-server ~]
# var = 1
bash: var: 未找到命令...
注意点
错误代码会跳过并继续执行之后的代码(解释性语言特点)!变量默认值为空!
例如
#! /bin/bash
string = "I am shell"
num=5
echo "a=${num},string=${string}"
执行
# sh test.sh
test.sh:行3: string: 未找到命令
a=5,string=
其他方式变量声明赋值
1、let 表达式赋值数值类型
[root@php.svn-server ~]
# let a=1;
[root@php.svn-server ~]
# echo $a
1
但是并不能放字符串
[root@php.svn-server ~]
# let a='qidong'
[root@php.svn-server ~]
# echo $a
0
2、从终端(stdin)获取变量赋值
#! /bin/bash
echo "who are you?"
read name
echo "hello, $name"
[root@php.svn-server ~]
# sh test.sh
who are you?
qidong [这里是手动输入的字符]
hello, qidong
3、解析linux命令来赋值
[root@php.svn-server ~]
# var=`cat test.sh`
[root@php.svn-server ~]
# echo $var
#! /bin/bash echo "who are you?" read name echo "hello, $name"
[root@php.svn-server ~]
# var=$(ls)
[root@php.svn-server ~]
# echo $var
! anaconda-ks.cfg bak_bjpowernode.com2019-01-24@11:42:13.zip bak_bjpowernode.com2019-06-06@16:09:57.zip bjpowernode_20190702.zip initial-setup-ks.cfg install.sh lua-5.3.5 lua-5.3.5.tar.gz nginx_software php-7.2.8 test.sh 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@php.svn-server ~]
简单的脚本获取linux上的所有用户
#!/usr/bin/env bash
index=1
for user in `cat /etc/passwd | cut -d ":" -f 1`
do
echo "This is ${index} user:$user"
index=$(($index+1))
done
$( () ) 这种方式 是算术运算
#!/usr/bin/env bash
echo "现在是今年的第$(date +%j)天"
echo "现在是今年的第$(($(date +%j)/7))个星期"
#!/bin/bash
nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [ $nginx_process_num -eq 0 ];then
sudo systemctl start openresty
fi
总结:和$()
是等价的 $(( ))
主要进行算术运算。$()
在unix的极少数系统可能不支持。 $( () )
包括加减乘除,引用变量前面可以加$,也可以不加
有类型的变量
declare命令
-r 将变量设为只读
var1=123
echo "$var1"
var1=321
echo ${var1}
declare -r var1=3
var1=4
#变量var1只读的
: line 18: var1: readonly variable
-i 将变量设置为整形
[root@docker-host sh]# num1=10
[root@docker-host sh]# num2=${num1}+20
[root@docker-host sh]# echo ${num2}
10+20
[root@docker-host sh]# declare -i num3
[root@docker-host sh]# num3=${num1}+20
[root@docker-host sh]# echo ${num3}
30
##expr 命令也可把字符串解析成整形
[root@docker-host sh]# echo `expr ${num1} + 20`
30
-f 显示此脚本前定义过的所有函数及内容
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
quote_readline ()
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
[root@docker-host sh]#
#显示系统n多个自带的函数
-F 仅显示此脚本定义过的所有函数名
-a 定义变量为数组
#声明一个数组变量名字叫做array的
[root@docker-host sh]# declare -a array
[root@docker-host sh]# array=("jones" "mike" "kobe" "jordan")
###输出数组的全部值
[root@docker-host sh]# echo ${array[@]}
jones mike kobe jordan
####输出数组下标为1的值
[root@docker-host sh]# echo ${array[1]}
mike
##############获取数组元素的个数#####
[root@docker-host sh]# echo ${#array[@]}
4
##############获取数组值得字符串长度############
[root@docker-host sh]# echo ${#array[0]}
5
-x 将变量声明为环境变量
在linux中$PATH就是环境变量
[root@docker-host sh]# echo "$PATH"
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/php/bin:/usr/local/openresty/nginx/sbin:/root/bin
######定义一个环境变量
[root@docker-host sh]# declare -x num
[root@docker-host sh]# num=5
[root@docker-host sh]# vim num.sh
#!/usr/bin/env bash
echo $num
[root@docker-host sh]# sh num.sh
5
[root@docker-host sh]#
取消声明的变量
declare +r
declare +i
declare +a
declare +X
系统给定的特殊变量
变量名 | 作用 |
---|---|
$0 | 当前脚本的名字 |
$n | 传递给脚本或者函数的参数,n表示第几个参数 |
$# | 传递给脚本或函数的参数个数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或者函数的所有参数 |
$$ | 当前shell脚本进程的PID |
$? | 函数返回值,或者上个命令的退出状态 |
$BASH | BASH的二进制文件问的路径 |
$BASH_ENV | BASH的启动文件 |
$BASH_VERSINFO[n] | BASH版本信息,有六个元素 |
$BASH_VERSION | BASH版本号 |
$EDITOR | 脚本所调用的默认编辑器 |
$EUID | 当前有效的用户ID |
$FUNCNAME | 当前函数名 |
$GROUPS | 当前用户所属组 |
$HOME | 当前用户家目录 |
$HOSTTYPE | 主机类型 |
$LINENO | 当前行号 |
$OSTYPE | 操作系统类型 |
$PATH | PATH路径 |
$PPID | 当前shell进程的父进程ID |
$PWD | 当前工作目录 |
$SECONDS | 当前脚本运行秒数 |
$TMOUT | 不为0时,超过指定的秒将退出shell |
$UID | 当前用户ID |
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以”$1” “$2” … “$n” 的形式输出所有参数。
但是当它们被双引号(” “)包含时,”$*” 会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;”$@” 会将各个参数分开,以”$1″ “$2” … “$n” 的形式输出所有参数。