Shell part1.1变量类型

shell 变量是用一个固定的字符串去表示不固定的内容,便于修改。

==变量类型==

自定义变量  环境变量    位置变量和预定义变量



=自定义变量=

A. 特性

1. 自定义变量(示例:ping01.sh引入变量)

定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115

引用变量: $变量名 或 ${变量名}

查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量)

取消变量: unset 变量名

作用范围:

仅在当前shell中有效

B. 示例:

使用变量前。麻烦

ping -c1 192.168.100.10 &>/dev/null  && echo 192.168.100.10up || echo 192.168.100.10down

使用变量后,简洁

#!/bin/bash

ip=192.168.100.10

ping -c1 $ip &>/dev/null  && echo $ip  up ||  echo "$ip  down"

C. 变量赋值(定义变量):

1. 显式赋值:变量名=变量值

示例:

ip1=192.168.1.251

school="BeiJing 1000phone"

today1=`date +%F`

today2=$(date +%F)

2. read 从键盘读入变量值

read 变量名

read -p "提示信息: " 变量名

read -t 5 -p "提示信息: " 变量名  //-t 等待5秒,后超时

read -n 2 变量名            //-n  只记录几个字符

示例:

read -p "请输入您测试的IP地址:" ip

ping -c1 $ip  &>/dev/null  && echo  " $ip up" || echo  "$ip  down"



=环境变量(了解)=

定义环境变量: 方法一 export back_dir2=/home/backup

方法二 export back_dir1 将自定义变量转换成环境变量

引用环境变量: $变量名 或 ${变量名}

查看环境变量: echo $变量名 env 例如env |grep back_dir2

取消环境变量: unset 变量名

变量作用范围: 在当前shell和子shell有效 !!!

使变量开机、登陆生效,将变量放到~/.bash_profile

永久生效:写到四个登录脚本,/etc/profile ~/.baserc ~/.bash_profile /etc/bashrc



=位置变量和预定义变量(了解)=

语法命令    参数1 参数2 参数3 ....9以后特殊定义

$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ...

预先定义过的变量

$0 脚本名

$* 所有的参数

$@ 所有的参数

$# 参数的个数

$$ 当前进程的PID

$! 上一个后台进程的PID

$? 上一个命令的返回值 0表示成功

示例

准备工作:

# vim test.sh

#!/usr/bin/bash

echo "第2个位置参数是$2"

echo "第1个位置参数是$1"

echo "第4个位置参数是$4"

echo "所有参数是: $*"

echo "所有参数是: $@"

echo "参数的个数是: $#"

echo "当前进程的PID是: $$"

echo '$1='$1

echo '$2='$2

echo '$3='$3

echo '$*='$*

echo '$@='$@

echo '$#='$#

echo '$$='$$

演示结果如下:

[root@localhost ~]# chmod +x test.sh

[root@localhost ~]# ./1.sh  1 2 3 4 5 6 7 8 9

第2个位置参数是2

第1个位置参数是1

第4个位置参数是4

所有参数是: 1 2 3 4 5 6 7 8 9

所有参数是: 1 2 3 4 5 6 7 8 9

参数的个数是: 9

当前进程的PID是: 1946

$1=1

$2=2

$3=3

$*=1 2 3 4 5 6 7 8 9

$@=1 2 3 4 5 6 7 8 9

$#=9

$$=1946



$*和$@区别(资料)

shell中$*与$@的区别

关于$* 和 $@的 一点 认识 同是菜鸟一起学习

$*  所有的位置参数,被作为一个单词.

注意:"$*"必须被“”引用.

$@ 与$*同义,但是每个参数都是一个独立的""引用字串,

这就意味着参数被完整地传递,并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的单词.

注意:"$@"必须被“”引用.

$@ $* 只在被双引号包起来的时候才会有差异

双引号括起来的情况:

$*将所有的参数认为是一个字段

$@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 "2 3" 4  来发现差异

没有括起来的情况是$@和$*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 "2 3" 4  来发现差异



一个小例子 ,仅供参考

[Copy to clipboard] [ - ]CODE:#!/bin/bash

echo

index=1

echo "Listing args with\"\$*\":"

for arg in "$*"

do

echo "Arg #$index=$arg"

let "index+=1"

done

echo "所有的参数被认为是一个单词"

echo

index=1

echo "Listing args with \"\$@\":"

for arg in "$@"

do

echo "Arg #$index=$arg"

let "index+=1"

done

echo "所有的参数被认为是各个独立的单词"

echo

index=1

你可能感兴趣的:(Shell part1.1变量类型)