变量的声明

[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

注意点

错误代码会跳过并继续执行之后的代码(解释性语言特点)!变量默认值为空!

例如

#! /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
$?函数返回值,或者上个命令的退出状态
$BASHBASH的二进制文件问的路径
$BASH_ENVBASH的启动文件
$BASH_VERSINFO[n]BASH版本信息,有六个元素
$BASH_VERSIONBASH版本号
$EDITOR脚本所调用的默认编辑器
$EUID当前有效的用户ID
$FUNCNAME当前函数名
$GROUPS当前用户所属组
$HOME当前用户家目录
$HOSTTYPE主机类型
$LINENO当前行号
$OSTYPE操作系统类型
$PATHPATH路径
$PPID当前shell进程的父进程ID
$PWD当前工作目录
$SECONDS当前脚本运行秒数
$TMOUT不为0时,超过指定的秒将退出shell
$UID当前用户ID

$* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以”$1” “$2” … “$n” 的形式输出所有参数。
但是当它们被双引号(” “)包含时,”$*” 会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;”$@” 会将各个参数分开,以”$1″ “$2” … “$n” 的形式输出所有参数。

Last modification:February 1, 2020
如果觉得我的文章对你有用,请随意赞赏