shell第一天

shell

Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。
**分类:**Bourne shell,标识为sh,在许多Unix系统中,该Shell时root用户默认的Shell;
Bourne-Again Sehll,标识为bash,是绝大多数locallhost发行版的默认Shell;
Korn Shell,标识为ksh
C Shell ,标识为 csh
查看当前系统支持的shell:cat 、etc/shells;查看当前系统默认shell:echo $SHELL
shell脚本:如果有一系列经常需要使用的命令,把它存储在一个文件里,shell可以读取这个文件并顺序执行其中的命令,我们把这样的文件就叫shell脚本。shell脚本按行解释文件里的命令。
驼峰语法:例如:myFirstName、myLastName
shell脚本的基本元素
1,声明::声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为#!/bin/bash
2,命令:可执行语句,实现程序功能
3,注释:说明某些代码的功能,提高程序可读性:(1)单行注释以#开头的一行都是注释(2)多行注释 :<<BLOCK
注释内容
BLOCK
4,赋予rx的权限
shell常用内部命令:
1,echo
[root@localhost ~]# echo -n i have a cat — -n不换行输出
i have a cat[root@localhost ~]#
[root@localhost ~]# echo i\thave\ta\tcat
ithavetatcat
[root@localhost ~]# echo -e i\thave\ta\tcat
ithavetatcat
[root@localhost ~]# echo -e “i\thave\ta\tcat” — -e解析转义字符
i have a cat
[root@locallhost~]#echo -e test\bv — \b退格,删除\b前一个字母
tesv

\n 换行;\r回车;\t制表符;\v纵向制表符
2,eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执
行。
[root@localhost test]# a=‘shuju;head -1 /etc/passwd’
[root@localhost test]# echo $a
shuju;head -1 /etc/passwd
[root@localhost test]# eval echo $a
shuju

3,exec:
exec命令能够在不创建子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后进程终止

4,export:设置或者显示环境变量

5,read:可以从标准输入读取字符串等信息,传给shell程序内部定义的的变量;-p prompt,设置提示信息;-t timeout,设置输入时间,单位默认为秒
[root@localhost test]# read -t 10 -p “please input your name:” name
please input your name:xiaoming
[root@localhost test]# echo $name
xiaoming
[root@localhost test]# echo -n “please input your name:”;read name1 name2
#读取两个输入(以空格隔开),分别赋值给name1和name2
please input your name:xiaoming xiaohong
[root@localhost test]# echo $name1
xiaoming
[root@localhost test]# echo $name2
xiaohong

6,shift,在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,并使位置参
数$#减1,直到减到0为止。

7,exit,退出shell程序。在exit之后可以有选择地指定一个数作为返回状态

执行脚本方法: 1,bash。/filename.sh(产生子进程,在运行,使用当前指定的bash shell去运行)(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)(4). filename.sh(和source一样,也是使用当前进程执行)
例1:
[root@localhost test]# vim test2.sh
#!/bin/bash
cd /tmp
pwd
[root@localhost test]# ls -l test2.sh
-rw-r–r–. 1 root root 24 Apr 30 20:09 test2.sh
(1)[root@localhost test]# bash test2.sh
/tmp
(2)[root@localhost test]# ./test2.sh
-bash: ./test2.sh: Permission denied
[root@localhost test]# chmod a+rx test2.sh
[root@localhost test]# ./test2.sh
/tmp
(3)[root@localhost test]# source test2.sh
/tmp
[root@localhost tmp]#
(4)[root@localhost test]# . test2.sh
/tmp
[root@localhost tmp]#
例2:
[root@localhost test]# echo ‘userdir=pwd’ > test3.sh
[root@localhost test]# cat test3.sh
userdir=pwd
(1)[root@localhost test]# bash test3.sh
[root@localhost test]# echo $userdir
[root@localhost test]#
(2)[root@localhost test]# chmod a+rx test3.sh
[root@localhost test]# ./test3.sh
[root@localhost test]# echo $userdir
[root@localhost test]#
(3)[root@localhost test]# source test3.sh
[root@localhost test]# echo $userdir
/test
(4)[root@localhost test]# . test3.sh
[root@localhost test]# echo $userdir
/test

变量和引用
命名:在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。

可以使用declare定义变量的类型:declare attribute variable
注:declare命令还可输出所有的变量、函数、整数和已经导出的变量
-p:显示所有变量的值
-i:将变量定义为整数,在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整
数,就设置为0。
-r:将变量声明为只读变量。只读变量不允许修改,也不允许删除。(也可使用readonly定义只读变量)
-a:变量声明为数组变量。但这没有必要,所有变量都不必显示定义就可以用作数组。事实上,在某
种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给下标为0的数组元素相同。
-f:显示所有自定义函数,包括名称和函数体。
-x:将变量设置成环境变量。可使用+x将变量变成非环境变量

自定义环境变量:环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,即该环境变量只在当前shell和子shell中有效。如果希望永久保存环境变量,可以在配置文件中设置。①用户的环境变量配置(non-login shell)/.bash_profile或/.bashrc②全局环境变量的配置(loginshell)/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。

bash内置环境变量:
变量 说明
PATH 命令搜索路径,以冒号为分隔符
HOME 用户主目录的路径名,是cd命令的默认参数
COLUMNS 定义了命令编辑模式下可使用命令行的长度
HISTFILE 命令历史文件
HISTSIZE 命令历史文件中最多可包含的命令条数
HISTFILESIZE 命令历史文件中包含的最大行数
IFS 定义shell使用的分隔符
LOGNAME 当前的登录名
SHELL shell的全路径名
TERM 终端类型
TMOUT shell自动退出的时间,单位为秒,若设为0则禁止shell自动退出
PWD 当前工作目录

全局变量和局部变量的区别:
例:
[root@localhost ~]# vim 6.sh
#!/bin/bash
#定义函数
func()
{
#输出全局变量v1的值
echo “global variable v1 is $v1”
#定义局部变量v1
local v1=2
#输出局部变量v1的值
echo “local variable v1 is $v1”
}
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1的值
echo “global variable v1 is $v1”
[root@localhost test]# chmod a+rx var.sh
[root@localhost test]# ./var.sh
global variable v1 is 1
local variable v1 is 2
global variable v1 is 1

变量的定义
1,定义变量示例:变量名=变量值【(1)“=”前后不能有空格;(2)字符串类型建议用引号括起来,尤其是有特殊字符或空格】
引用变量: 变 量 名 或 者 变量名 或者 {变量名}
查看变量:echo $变量名,set(可查看所有变量:包括自定义变量和环境变量),env显示全局变量,declare输出所有的变量、函数、整数和已经导出的变量。
取消变量:unset 变量名
作用范围:仅在当前shell中有效
注:可使用export指令将变量转换成环境变量

位置参数和预定义变量:
$# 命令行参数的个数
$n 表示传递给脚本的第n个参数,例如$1表示第一个参数,$2表示第二个参数,$3表示第三
个参数
$0 当前脚本的名称
$* 以"参数1 参数2 参数3…"的形式返回所有参数的值
$@ 以“参数1”“参数2”“参数3”…的形式返回所有的值
? 前 一 个 命 令 或 者 函 数 的 返 回 状 态 码 。 ? 前一个命令或者函数的返回状态码。 ??的返回值用法:(1)判断命令、脚本或函数等程序
是否执行成功(2)若在脚本中调用执行“exit 数字”,则会返回这个数字给“ ? ” 变 量 ( 3 ) 如 果 是 在 函 数 里 , 则 通 过 “ r e t u r n 数 字 ” 把 这 个 数 字 以 函 数 值 的 形 式 传 给 “ ?”变量(3)如 果是在函数里,则通过“return 数字”把这个数字以函数值的形式传给“ ?3return?”
$$ 返回本程序的进程ID(PID),不常用
$! 获取上一个在后台工作的进程的进程号,不常用
$_ 保存之前执行的命令的最后一个参数,不常用

shell中的引用:
转义字符“\”:如果将\放到特殊字符前面,shell就忽略这些特殊字符的原有含义,把它们当作普通字符
对待
单引号:如果将字符串放到一对单引号之间,那么字符串中所有字符的特殊含义被忽略
双引号:双引号的引用与单引号基本相同,包含在双引号内的大部分特殊字符可以当作普通字符处
理,但是仍然有一些特殊字符保留自己的特殊含义,比如”$“和“\”以及“ ` ”
说明:反引号中的字符串将被解释为shell命令

变量的运算:
+、- 求和、差
、/、% 求乘积,商,余数
** 幂运算,例如3**3是求3的立方,即27
+=、-=、
=、/=、%= 例a+=1相当于a=a+1
++variable、–variable 先将变量variable的值加1,然后再赋给variable; 先将变量variable的值减1,然后再赋给variable
variable++、variable-- 先使用variable的值,然后再将该变量的值加1; 先使用variable的值,然后再将该变量的值减1
位运算符<<、>> 位运算通常出现在整数间,它针对的不是整个整数,而是其二进制表示形式中的
某个或者某些位(bit)。例如,2>>1是将二进制形式的2,即10,左移1位,从
而变成100,即4。 左移,4<<2,将4左移2位,结果为16; 右移,8>>2,将8
右移两位,结果为2

&、|、~、^ 按位与,8&4,将8和4进行按位与运算,结果为0; 按位或,8|4,将8和4进行
按位或运算,结果为12; 按位非,~8,将8进行按位非运算,结果为-9(一个字
符占一个字节,即8个二进制位,最高位为1时为负数); 按位异或(a异或b,
a、b值不同结果为1,相同结果为0),10^6,将10和6进行按二进制位异或运
算,结果为12。
<<=、>>= 将变量的值左移指定位数之后重新赋给该变量,x<<=3,将x的值左移3位,重新赋给变量x; 将变量的值右移指定位数之后重新赋给该变量,x>>=4,将变量x的值右移4位后重新赋给变量x。

&=、|=、^= 将变量的值与指定的数值按位与之后重新赋给该变量,x&=8,将变量x的值与8按位与运算之后重新赋给变量x; 将变量的值与指定的数值按位或之后重新赋给该变量,x|=7,将变量x的值与7执行按位或运算之后重新赋给变量x; 将变量的值与指定的数值按位异或之后重新赋给该变量,x^=9,将变量x的值与9执行按位异或运算之后重新赋给变量x。

(()):
用于整数运算的常用运算符在(())中使用变量时可以去掉变量前的 符 号 l e t : 用 于 整 数 运 算 使 用 l e t 命 令 可 以 执 行 一 个 或 者 多 个 算 术 表 达 式 , 其 中 的 变 量 名 毋 需 使 用 符号 let : 用于整数运算使用let命令可以执行一个或者多个算术表达式,其中的变量名毋需使用 let使let使符号
expr:
可用于整数运算,但还有很多其他的额外功能使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则会报错;使用乘号时,必须使用反斜线屏蔽其特定含义;使用expr做计算,将一个未知的变量和一个已知的整数相加,看返回码是否为0,如果为0就认为做加法的变量为整数,否则就不是整数。
bc:
linux下的一个计算器程序(适合整数及小数运算)[root@localhost test4]# echo seq -s “+” 10 = seq -s “+” 10 | bc;seq是生成数字序列,-s是指定数字序列之间的分隔符
$[] :
用于整数运算
awk:
awk既可以用于整数运算,也可以用于小数运算
declare:
定义变量值和属性,-i参数可以用于定义整形变量,做运算

表达式 说明
${parameter} 返回变量的内容
${#parameter} 返回变量内容的长度(按字符)
p a r a m a t e r : o f f s e t 在 变 量 {paramater:offset} 在变量 paramater:offset{parameter}中,从位置offset之后开始提取子串到结

p a r a m a t e r : o f f s e t : l e n g t h 在 变 量 {paramater:offset:length} 在变量 paramater:offset:length{parameter}中,从位置offset之后开始提取长度为
length的子串
KaTeX parse error: Expected '}', got '#' at position 11: {parameter#̲word} 从变量{parameter}开头开始删除最短匹配的word子串
KaTeX parse error: Expected '}', got '#' at position 11: {parameter#̲#word} 从变量{parameter}开头开始删除最长匹配的word子串
KaTeX parse error: Expected '}', got 'EOF' at end of input: …er%word} 从变量{parameter}结尾开始删除最短匹配的word子串
KaTeX parse error: Expected '}', got 'EOF' at end of input: …er%%word} 从变量{parameter}结尾开始删除最长匹配的word子串
${parameter/pattern/string} 使用string代替第一个匹配的pattern
${parameter//pattern/string} 使用string代替所有匹配的pattern

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值