shell基础
1.shell是什么?
首先shell的英文含义是“壳”;
它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。
Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息
shell在Linux中的存在形式:
由于Linux不同于Windows,Linux是内核与界面分离的,它可以脱离图形界面而单独运行,同样也可以在内核的基础上运行图形化的桌面。
这样,在Linux系统中,就出现了两种shell表现形式,一种是在无图形界面下的终端运行环境下的shell,另一种是桌面上运行的类似Windows 的MS-DOS运行窗口,前者我们一般习惯性地简称为终端,后者一般直接称为shell
shell如何执行用户的指令:
shell有两种执行指令的方式,第一种方法是用户事先编写一个sh脚本文件,内含shell脚本,而后使用shell程序执行该脚本,这种方式,我们习惯称为shell编程。
第二种形式,则是用户直接在shell界面上执行shell命令,由于shell界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行。
总结: shell可以说只是为用户与机器之间搭建成的一个桥梁,让我们能够通过shell来对计算机进行操作和交互,从而达到让计算机为我们服务的目的。
2.第一个shell脚本
#!/bin/bash #指定shell程序的解释器
# 从终端读取用户输入的数据 并赋值给preson变量
# read命令来从标准输入中读取用户输入的数据
echo "What is your name ?"
read preson
echo "hello, $preson"
3.shell脚本的执行
运行 Shell 脚本有两种方法,一种在新进程中运行,一种是在当前 Shell 进程中运行
4.定义变量
定义变量等号两边没有空格
#!/bin/bash
url=http://www.westos.org
echo $url
author="westos-LL"
echo $author
echo ${author}
有无花括号的区别:如果没有花括号,变量未定义,举例如下:
#!/bin/bash
skill="Java"
echo "I am a good ${skill}script"
定义变量会翻译一行解释一行:
#!/bin/bash
url=http://www.baidu.com
echo ${url}
url="http://www.taobao.com"
echo $url
单双引号的区别:
单引号是强引用,引号里面是什么就输出什么
双引号包围变量,输出时会解释变量和命令
#!/bin/bash
url="http://www.westos.org"
website1='LL:${url}'
website2="LL:${url}"
echo $website1
echo $website2
** 取消变量:** unset
#!/bin/bash
myurl="http://www.westos.org"
unset myurl
echo $myurl
只读变量: 设置成只读变量不能用unset删除,也不能修改
#!/bin/bash
myurl="www.westos.org"
readonly myurl
#unset myurl
myurl="www.westos.com"
echo $myurl
将变量声明为整数并进行计算:declare
#!/bin/bash
declare -i m n ret
m=10
n=30
ret=$m+$n
echo $ret
5.shell命令的替换
sleep不需导入安装包,直接使用
反引号和$()可以替换
#!/bin/bash
begin_time=`date`
sleep 10s
finish_time=$(date)
echo "Begin time: $begin_time"
echo "Finish time: $finish_time"
被输出的变量有多行(包含换行符)时,用引号输出会更好。
#!/bin/bash
LSL=`ls -l`
echo $LSL
echo "___________________"
echo "$LSL"
6.shell的数学计算
shell不能直接进行数学运算
双小括号((a=1+1))
a=$((1+1))
echo $((1+1))
((i=i2)) ----->echo $i
echo $((3<8)) ------->输出1为true,0为false
a=10 b=20 echo $((a+b))或者echo let a+b
expr 2 + 2 2 * 2 数字两边必须有空格
echo $[23] $[2/3]
小数计算用bc命令,如果commend not found 需要安装(yum whatprovides */bc)
echo 3.6+5.6|bc
7.shell的特殊参数
$0 | 当前脚本的文件名 |
---|---|
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
$* 和 $@ 的区别:
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … @" 会将各个参数分开,以"$1" “n” 的形式输出所有参数。
#!/bin/bash
foo(){
echo $*
}
bar(){
echo $@
}
foo 1 2 3 4
bar 1 2 3 4
退出状态
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
8.shell字符串
${#string} | $string的长度 |
---|---|
${string:position} | 在position开始提取子串 |
${string:position:length} | 在position开始提取长度为$length的子串 |
1.长度
[LL@localhost ~]$ test=‘I love china’
[LL@localhost ~]$ echo ${#test}
12
2.截取字串
[LL@localhost ~]$ test=‘I love china’
[LL@localhost ~]$ echo ${test:5}
e china
[LL@localhost ~]$ echo ${test:5:10}
e china
${变量名:起始:长度}得到子字符串
3.字符串删除
[LL@localhost ~]$ test='c:/windows/boot.ini'
[LL@localhost ~]$ echo ${test#/}
c:/windows/boot.ini
[LL@localhost ~]$ echo ${test#*/}
windows/boot.ini
[LL@localhost ~]$ echo ${test##*/}
boot.ini
[LL@localhost ~]$ echo ${test%/*}
c:/windows
[LL@localhost ~]$ echo ${test%%/*}
${变量名#substring正则表达式}从字符串开头开始配备substring,删除匹配上的表达式。
${变量名%substring正则表达式}从字符串结尾开始配备substring,删除匹配上的表达式。
**注意:${test##*/},${test%/*} 分别是得到文件名,或者目录地址最简单方法**
4.字符串替换
[LL@localhost ~]$ test='c:/windows/boot.ini'
[LL@localhost ~]$ echo ${test/\//\\}
c:\windows/boot.ini
[LL@localhost ~]$ echo ${test//\//\\}
c:\windows\boot.ini
${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。
9.shell常用命令
1.alias
Linux alias命令用于设置指令的别名。
用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在.profile或.cshrc中设定指令的别名
alias lx=ls
2.echo
#!/bin/bash
name='Tom'
age=20
height=180
weight=70
echo -n "${name} is ${age} years old,"
echo -n "${height}cm in height "
echo "and ${weight}kg in weight"
echo "Thank you!"
#!/bin/bash
name='Tom'
age=20
height=180
weight=70
# echo -e结合\c 强制echo命令不换行
echo -e "${name} is ${age} years old, \c"
echo -e "${height}cm in height \c"
echo "and ${weight}kg in weight"
echo "Thank you!"
3.read
#!/bin/bash
# read -p 显示提示信息 input("str:")
# 注意:必须在一行内输入所有的值 不能换行
# 否则 只能给第一个变量赋值 后续变量赋值都会失败
read -p "Enter some information >" name url age
echo "网站的名字:$name"
echo "网址:$url"
echo "年龄:$age"
#!/bin/bash
# read -n num
# -n 1 表示只读取一个字符
read -n 1 -p "Enter a char >" char
printf "\n"
echo $char
来源:CSDN
作者:Aa. NiceMan
链接:https://blog.csdn.net/AaNiceMan/article/details/104310157