前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell学习(八)Shell变量

shell学习(八)Shell变量

原创
作者头像
god_frey
修改2022-05-08 23:28:32
7950
修改2022-05-08 23:28:32
举报
文章被收录于专栏:个人linux学习笔记

本地变量

定义Shell变量,变量名不需要加美元符号 $

本地变量只在当前shell生存期中有效

变量定义

变量名要求:字母、数字、下划线组成,只能是字母或下划线开头,变量名严格区分大小写

取出变量值

  • 单引号,强引用
  • 双引号,输出引号内所有内容,识别特殊符号,弱引用
  • 无引号,连续的符号可以不加引号,有空格则有歧义,最好使用双引号
  • 反引号,引用命令执行结果,等于$()用法

特殊参数变量

shell的特殊变量,用在如脚本,函数传递参数使用,有如下特殊的,位置参数变量

代码语言:shell
复制
$0    获取shell脚本文件名,以及脚本路径
$n    获取shell脚本的第n个参数,n在1~9之间,如$1,$2,$9,大于9则需要写${10},参数空格隔开
$#    获取执行的shell脚本后边的参数总个数
$*    获取shell脚本所有参数,不加引号等同于$@作用,加上引号"$*"作用是接收所有参数为单个字符串,"$1 $2.."
$@    不加引号,效果同上,加引号是接收所有参数为独立字符串,如"$1" "$2" "$3" ...,空格保留

实践脚本

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ cat special_var.sh 
#! /bin/bash
echo '特殊变量 $0 $1 $2 ..的实践'
echo '结果:' $0 $1 $2

echo '#########################'
echo '特殊变量$#获取参数总个数'
echo '结果:' $#

echo '#########################'
echo '特殊变量 $*的实践'
echo '结果:' $*


echo '#########################'
echo '特殊变量$@实践'
echo '结果:' $@

执行结果

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ bash special_var.sh god_frey 180 180 180 180
特殊变量 $0 $1 $2 ..的实践
结果: special_var.sh god_frey 180
#########################
特殊变量$#获取参数总个数
结果: 5
#########################
特殊变量 $*的实践
结果: god_frey 180 180 180 180
#########################
特殊变量$@实践
结果: god_frey 180 180 180 180

试题

代码语言:javascript
复制
$* 和 $@ 的区别是什么?
$* 和 $@ 都表示传递给函数或脚本的所有参数
当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,
彼此之间以空格来分隔。

但是当它们被双引号" "包含时,就会有区别了:
"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
“god_frey 180 180 180 180”

"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

“god_frey ”
“180”
“180”
“180”
“180”

比如传递了 5 个参数,那么对于"$*"来说,这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;
而对于"$@"来说,这 5 个参数是相互独立的,它们是 5 份数据。

如果使用 echo 直接输出"$*"和"$@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,
立即就能看出区别来。

shell for循环的知识

反斜杠 '\' ,是转义符号

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ cat different.sh 
#!/bin/bash

echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done

echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done

执行结果

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ bash different.sh god-frey 180 180
print each param from "$*"
god-frey 180 180
print each param from "$@"
god-frey
180
180

特殊状态变量

代码语言:javascript
复制
  $?  上一次命令执行状态返回值,0正确,非0失败
  $$  当前shell脚本的进程号
  $!  上一次后台进程的PID
  $_  再次之前执行的命令,最后一个参数
  
    查找方式 man  bash
      搜索 Special Parameters

脚本返回值指脚本执行完毕了,会返回一个数字id,称之为返回值

实践脚本

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ cat special_symbol.sh 
#! /bin/bash

# $#获取参数个数 -ne 不等于的情况   &&并且
[ $# -ne 2 ] && {
	echo "must be two args"
	exit 119 #终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 为return 119
}
echo ok

执行结果

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god frey 180
must be two args
ubuntu@VM-12-16-ubuntu:~$ echo $?
119
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god_frey 180
ok
ubuntu@VM-12-16-ubuntu:~$ echo $?
0

获取上一次后台执行的程序PID, $!获取

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ nohup ping baidu.com & 1> /dev/null
[3] 18551
ubuntu@VM-12-16-ubuntu:~$ nohup: ignoring input and appending output to 'nohup.out'

ubuntu@VM-12-16-ubuntu:~$ ps -ef | grep ping
ubuntu   18551 31188  0 23:23 pts/0    00:00:00 ping baidu.com
ubuntu   18614 31188  0 23:24 pts/0    00:00:00 grep --color=auto ping
ubuntu@VM-12-16-ubuntu:~$ echo $!
18551

获取当前

脚本的PID

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ cat special_symbol.sh 
#! /bin/bash

# $#获取参数个数 -ne 不等于的情况   &&并且
[ $# -ne 2 ] && {
	echo "must be two args"
	exit 119 #终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 为return 119
}
echo ok

echo "当前的脚本pid是:$$"

执行结果

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god_frey 180
ok
当前的脚本pid是:19483

获取上次命令的最后一个参数

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god_frey 180
ok
当前的脚本pid是:19483
ubuntu@VM-12-16-ubuntu:~$ echo $_
180

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档