shell基础

限于喜欢 提交于 2020-02-15 23:52:39

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 $[2
3] $[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" “2""2" … "n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n""n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “2""2" … "n” 的形式输出所有参数。

#!/bin/bash
foo(){
 echo $*
}
bar(){
 echo $@
}
foo 1 2 3 4
bar 1 2 3 4

退出状态
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

8.shell字符串

${#string} $string的长度
${string:position} string,string中, 从位置position开始提取子串
${string:position:length} string,string中, 从位置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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!