zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Shell_第三章_(输出颜色、printf、环境变量、(位置参数、预定义)的变量、变量赋值)

输出变量shell 参数 位置 颜色 环境变量 赋值
2023-09-11 14:21:27 时间

1、echo输出颜色

  echo -e "\033[31m 红色字 \033[0m"
  echo -e "\033[32m 绿色字 \033[0m"
  echo -e "\033[33m 黄色字 \033[0m"
  echo -e "\033[34m 蓝色字 \033[0m" 
  等等自行百度
  作用:一般报错,加红色字,成功加绿色字 

2、Linux中printf格式化输出

printf使用文本或者由空格分隔的参数,我们可以在printf中使用格式化字符串。
printf不会写像echo那样自动添加换行符,必须手动添加

=========================================
代码区域
=========================================

[root@localhost data]# vi 123.sh 
#!/bin/bash

printf "%-5s %-10s %-4s\n" no Name Mark
printf "%-5s %-10s %-4.2fs\n" 1 OLIVER 99.2
printf "%-5s %-10s %-4.2fs\n" 2 QIN    87.2


结果:
[root@localhost data]# sh 123.sh 
no    Name       Mark
1     OLIVER     99.20s
2     QIN        87.20s
[root@localhost data]# 

(1) c%,s%,d%和f%都是格式替代符,其所对应的参数可以置于带引号的格式化字符串之后。
(2) %-5s指明了一个格式为左对齐且宽度为5的字符串替代(-表示左对齐),默认的是右对齐
(3) -4.2f%指保留2位小数。

3、系统环境变量

 3.1、查看配置的环境变量:

[root@localhost data]# env       # 或者输入export
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.4.7.1 55042 22
OLDPWD=/data/123
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/test/bin
a=1
PWD=/data
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=10.4.7.1 55042 10.4.7.8 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

3.2、全局变量、环境变量区别:

[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# export b
[root@localhost ~]# echo $a
1
[root@localhost ~]# echo $b
2
[root@localhost ~]# su jerry
[jerry@localhost root]$ echo $a

[jerry@localhost root]$ echo $b
2

export 是用来声明全局环境变量的,如果输入export +变量名,就把变量声明为全局变量了。可以在任何路径执行。任何用户都能够调用。但此方法声明的环境变量仅存在当前的shell中有效。

3.2、自定义环境变量永久任意界面生效:

[root@localhost data]# vi /etc/profile

export b=2                                    # 在文件的最后一行添加
[root@localhost data]# source /etc/profile    # source 后才能生效,或者重启

3.3、自定义PATH环境变量永久任意界面生效:

1、PATH环境变量
        path(环境变量)是dos以前的内部命令,windows、Linux 继续沿用至今。用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找。
        一般设定java的时候为了在任何目录下都可以运行bin文件夹下的命令。就将java的bin目录声明到path中。
        一个“PATH=/bin:/usr/bin:/usr/local/bin:/usr/local/jdk/bin:...”环境变量高速操作系统,当接到用户送入的命令时,依次检索“/bin”、“/usr/bin”、“/usr/local/bin”、“/usr/local/jdk/bin”等目录,直到找到用户输入的命令。

2、 $PATH
        $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接。

3、添加永久自定义PATH环境变量

[root@localhost data]# vi /etc/profile
unset -f pathmunge
export PATH=$PATH:/test/bin                   # 在文件的最后一行添加
[root@localhost data]# source /etc/profile    # source 后才能生效

解释:
export PATH=$PATH:/test/bin      # $PATH取当前的环境变量,然后加上:/test/bin,在重新赋值给PATH

3.4 取消环境变量

unset 变量名字

4、位置参数变量

脚本参数传参:`$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}.....`
编写一个脚本,脚本中的$1..${10}....,对应的引用是,命令行脚本后的参数(空格为分隔符)

[root@localhost data]# vi 123.sh 
#!/bin/bash

echo "$1"
echo "$2"
echo "$3"
echo "$12"
echo "${12}"
echo "$7"
echo "$6"
echo "$8"
echo "$9"
echo "$4"
echo "$5"
echo "${10}"
echo "$10"
echo "${11}"
[root@localhost data]# 

[root@localhost data]# sh 123.sh 1 2 3 4 5 6 7 8 9 10 11 12
1
2
3
12
12
7
6
8
9
4
5
10
10
11

5、预先定义的变量

$0   脚本名
$*   所有的参数
$@   所有的参数
$#   参数的个数
$$   当前进程的PID,如果是脚本,指的是当前脚本的PID
$!   最近一次后台运行进程的PID
$?   上一个命令的返回值 0 代表成功,其他表示失败

  实验:$0   $@   $#   $$   

[root@localhost data]# vi 123.sh 
#!/bin/bash

echo "脚本名:  " $0 
echo "所有的参数:  " $*   
echo "所有的参数:  " $@ 
echo "参数的个数:  " $#   
echo "当前进程的PID:  " $$  

结果:

[root@localhost data]# sh 123.sh 1 2 3 4
脚本名:   123.sh
所有的参数:   1 2 3 4
所有的参数:   1 2 3 4
参数的个数:   4
当前进程的PID:   2471

[root@localhost ~]# ps -ef |grep 123.sh
root       2471   2300  0 19:12 pts/0    00:00:00 sh 123.sh 1 2 3 4
root       2474   2453  0 19:13 pts/1    00:00:00 grep --color=auto 123.sh
[root@localhost ~]# 

  实验:$!  最近一次后台运行进程的PID

[root@localhost data]# vi 123.sh 
#!/bin/bash
sleep 100

[root@localhost data]# vi 456.sh 
#!/bin/bash
sleep 100

[root@localhost data]# sh 123.sh &
[1] 2490
[root@localhost data]# echo $!
2490

[root@localhost data]# sh 456.sh &
[2] 2492
[root@localhost data]# echo $!
2492

  实验: $?  

随便瞎输入命令后一定报错,$?非0,如果正确$? 0
[root@localhost data]# systenmc reshan sda    
-bash: systenmc: 未找到命令

[root@localhost data]# echo $?
127
[root@localhost data]# echo 1
1
[root@localhost data]# echo $?
0
[root@localhost data]# 


一般有什么用:做前命令的执行成功的判断
[root@localhost data]# vi 123.sh 
#!/bin/bash

ping -c 1 $1 &>/dev/null

if [ $? -eq 0 ];then
    echo -e "ok"
else
    echo -e "no ok"
fi

[root@localhost data]# sh 123.sh 192.168.3.221 
ok
[root@localhost data]# sh 123.sh 192.168.1.23 
no ok

6、变量赋值方式

1、显示赋值(变量名=变量值)

ip=192.168.2.23
today1=`date +F%`
today2=$(date +F%)

2、read 从键盘读入变量值

-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。

例如:
1、打印信息后,让用户输入变量 (read -p "提示信息:" 变量名)
2、打印信息后,只停留5s让用户输入变量,否则退出(read -t 5 -p "提示信息:" 变量名)
3、输入多条数据 
[root@localhost data]# vi 456.sh 
#!/bin/bash
echo "Please name sex age:"
read name sex age
echo "name: $name sex: $sex age:$age"

[root@localhost data]# sh 456.sh 
Please name sex age:
jj nan 12
name: jj sex: nan age:12
[root@localhost data]# 

4、read -a 将内容读入到数值中
echo -n "Input muliple values into an array:"
read -a array
echo "get ${#array[@]} values in array"