shell变量与其他

一、什么是变量

简单说变量就是让一个特定的字符或字符串代表一个数字或者不特定的数值
一般都是用一个简单易懂的有意义的字符串代表一个复杂或变化的数据
A=1
A是变量
1是定义的数字

A=1
[root 04:45 PM t2sh ~]# echo $A
1

二、如何设定变量

设定规则:

1.变量名与变量内容用一个 = 链接,且等号两边不可以有空格

name=t2sh

2.变量名称只能是英文字母与数字,但是开头不可以是数字

2name=t2sh
#错误示范

3.如果要设置的变量内容中有特殊字符% $ 空格等则需要用‘ ’" "来引起来,单引号不保留特殊字符的特性一般为纯文本 ,双引号保留特性

var="lang is $LANG"
则
echo $var
lang is en_US
-----------------
var='lang is $LANG'
则
echo $var
lang is $LANG

注意:

  1. 可⽤用转意符 \ 将特殊符号(如 [Enter] , $ , \ , 空格符 , 等)变成⼀一般字 符;
  2. 在⼀一串串命令中,还需要藉由其他的命令提供的信息,可以使⽤用反单引号 `` 或 $(命 令) (推荐这种)。特别注意,那个反引号 是键盘上⽅方癿数字 键 1` 左边那个按键,⽽而不不是单引号

如:

version=$(uname -r) 
# 再 
echo $version
# 可得 4.9.125-linuxkit

增加变量量的内容时,则可⽤用 "{变量量}字符串串 (推荐) 累加内容,如下所示:

[root 07:10 PM t2sh ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root 07:10 PM t2sh ~]#PATH=${PATH}:/wujin/bin/
[root 07:11 PM t2sh ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/wujin/bin/

该变量的改变只在当前有效若需要在其他子程序生效,则需要执行export来使变量变成环境变量
注:子进程只会继承父进程的环境变量,若需继承父进程的自定变量则需要export

export PATH

通常情况下大写字符为系统默认,自定义变量多为自己设置方便的小写字符
取消变量的方法 unset

unset PATH

linux中生成随机数 RANDOM

[root 07:16 PM t2sh ~]#echo $RANDOM
18075
[root 07:16 PM t2sh ~]#echo $RANDOM
31830
[root 07:16 PM t2sh ~]#echo $RANDOM
10183

系统变量PS1:(系统标头提示字符的设置)


linux系统标头

一般设置PS1是在.bashrc中设置



PS1提示字符参数

env 系统默认环境变量

列出shell环境下的所有环境变量量及其内容

变量量内容的删除、取代与替换

[root 07:32 PM t2sh ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/wujin/bin/
[root 07:32 PM t2sh ~]#echo ${PATH%:*}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

% 从字符串的后面开始进行匹配删除,但匹配到第一个时就结束匹配

从字符串的前面开始进行匹配删除,但匹配到第一个时就结束匹配

取代与替换

image.png

var=${str:-expr}
str 和 var 可以是相同的字符串串。比如 inpu_date=${inpu_date:-expr}
expr 可以是任意合法的表达式,比如一个字符串串,一个子 shell 的命令 $(date +%F)
示例,假如希望⽤用户输入一个日期,当用户没有输入时,就给一个默认值,这里 给的是当天的日期

[root 07:32 PM t2sh ~]#vim test.sh
read -p '输入你的名字:' input                           #输入名字后给input赋值
input=${input:-弟弟}                               #赋值后输出所赋值,如果输入为空则引用:-后的值
echo "你的名字叫:$input"

[root 07:39 PM t2sh ~]#sh test.sh 
输入你的名字:1                                 #input=1
你的名字叫:1

[root 07:39 PM t2sh ~]#sh test.sh 
输入你的名字:                              #input为空
你的名字叫:弟弟

时间运算

// 计算 3 小时之后几点几分 date +%T -d '3 hours'
// 任意日期的前 N 天,后 N 天的具体日期
date +%F -d "20190910 1 day"             
date +%F -d "20190910 -1 day"
// 计算两个⽇日期相差天数 , ⽐比如计算⽣生⽇日距离现在还有多少天 
d1=$(date +%s -d 20180728)            #查看20180728自linux元年的总秒数
d2=$(date +%s -d 20180726) 
echo $(((d1-d2)/86400))                        #两个总秒数相减除以86400s = 天数

什么是正则表达式

简单的说,正则表达式就是处理字串的方法,他是以行为单位来进行字串的处理行为, 正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到“搜寻/删除/取代”某特定字串的处理程序!

正则表达式基本上是一种“表达式”, 只要工具程序支持这种表达式,那么该工具程序就可以用来作为正则表达式的字串处理之用。 例如 vi, grep, awk ,sed 等等工具,因为她们有支持正则表达式, 所以,这些工具就可以使用正则表达式的特殊字符来进行字串的处理。但例如 cp, ls 等指令并未支持正则表达式, 所以就只能使用 Bash 自己本身的通配符而已。

关于语系

在对linux系统进行操作之前最好查看一下系统语序

LANG=C 时:0 1 2 3 4 ... A B C D ... Z a b c d ...z
LANG=zh_TW 时:0 1 2 3 4 ... a A b B c C d D ... z Z

GREP的用法

标记处重点记忆

演示:


匹配出红色标注

其他的类推



grep的筛选字符

进阶  grep

1.-A   n  把匹配成功行之后的n行也同时列出
2.-B   n  把匹配成功行之前的n行也同时列出
[root 08:01 PM t2sh ~]#grep -A2 -B3 -n ftp /etc/passwd
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin
14-systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin


显示 目标行的前后各 3 行
[root 08:02 PM t2sh ~]# grep mail -C  3 /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

1.只显示匹配到的字符



2.统计数量



3.匹配文件名
4.递归查找
grep  -r  'nologin' /etc/
5.搜索 test 或 tast
grep -n 't[ae]st'  regular_repress.txt
6.显示oo 前面非小写字符的行
方法一:
grep -n ‘[^a-z]oo’ regular_repress.txt
方法二:
grep -n  ‘[^[:lower:]]oo’ regular_repress.txt
7.显示开否非英文字符的行
grep -n  ‘^[^[:alpha]]’ regular_repress.txt
符号 ^ 在 [] 内时是取反的意思,在 [] 之外是行首的意思
显示行首不是#和;的行

grep '^[^#;]' regular_repress.txt
找到以 . 结尾的行

grep -n  ‘\.$’ regular_repress.txt
需要用 \ 进行转意
查找 开头是 g 和结尾也是 g ,中间的字符可有可无

grep -n   'g.*g' regular_repress.txt
. 代表一个任意字符
* 代表重复零到多个在 其前面的一个字符
.* 代表零个或多个任意字符

查找仅含有2个o的字符串


grep -n 'o\{2\}' regular_express.txt

输出:
1:"Open Source" is a good mechanism to develop programs.
19:gooooogle yes!

扩展grep -E/egrep

支持扩展正则的工具

grep -E

egrep

sed

awk

你可能感兴趣的:(shell变量与其他)