(一)Linux Shell编程——简介、变量

1. Shell简介

1.1 Shell出现背景

Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。

对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell

1.2 Shell作用

Shell 除了能解释用户输入的命令,将它传递给内核,还可以:

  • 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
  • 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
  • Shell 本身也可以被其他程序调用。

由此可见,Shell 是将内核、程序和用户连接了起来。
Shell 本身支持的命令并不多,但是它可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

常见的 Shell 有 sh、bash、csh、tcsh、ash 等。这里使用Linux默认的bash shell (兼容sh),对其他Shell不加探究。

2. Shell语法

2.1 helloWorld及授权

编写shell脚本,输出hello world

[[email protected] testShell]# vim myShell.sh 

#!/bin/bash
echo "hello world!!!"

通过上面代码,可以看出:“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

编写之后,运行该文件会提示权限不够

[[email protected] testShell]# ./myShell.sh
-bash: ./myShell.sh: 权限不够

授给该文件x(执行)权限

[[email protected] testShell]# chmod 744 ./myShell.sh
[[email protected] testShell]# ls -l
总用量 4
-rwxr--r--. 1 root root 34 6月  10 20:47 myShell.sh

输入该脚本文件的相对路径和绝对路径都可以执行该脚本

[[email protected] testShell]# ./myShell.sh
hello world!!!
[[email protected] testShell]# /home/testShell/myShell.sh
hello world!!!

2.2 Shell变量

2.2.1 Shell变量分类

Shell变量分为环境变量和用户自定义变量(局部变量)。

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量;环境变量是所有的程序,包括shell启动的程序都能访问的变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

2.2.2 变量定义

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

v1=hello
v2=‘hello‘   #如果 value 包含了空白符,那么就必须使用引号包围起来
v3="hello"   #解析变量的话需要加双引号

赋值号的周围不能有空格。

2.2.3 变量使用

address="中关村"
echo $address
echo ${address}
echo "海淀${address}百度大厦"

变量的使用是通过 "$var",“${var}”的方式来调用,推荐给所有变量加上花括号{ },这是个良好的编程习惯。

2.2.4 单引号和双引号的区别

name=" world!!!"
v1=‘hello ${name}‘
v2="hello ${name}"   #解析变量的话需要加双引号
echo "v1 is ${v1}"
echo "v2 is ${v2}"

执行上面代码,通过输出可以看出单引号和双引号的区别

[[email protected] testShell]# ./myShell.sh
v1 is hello ${name}
v2 is hello  world!!!

2.2.5 将命令的结果赋值给变量

variable=`ls`   #`非‘
echo ${variable}
variable=$(ls)
echo ${variable}

第一种方式把命令用反引号包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

2.2.6 删除变量

name="world"
unset name
echo ${name}   #无输出

2.2.7 只读变量

readonly name="world"    #声明方式一:直接声明

address="中关村"
readonly address         #声明方式二:定义之后再声明

echo "name is ${name} and address is ${address}"

name="hello"   #修改变量值
unset address   #删除变量

通过执行输出可以看到,只读变量不能修改和删除。

[[email protected] testShell]# ./myShell.sh
name is world and address is 中关村
./myShell.sh: line 9: name: readonly variable
./myShell.sh: line 10: unset: address: cannot unset: readonly variable

2.3 特殊变量

通常来讲,变量名只能包含数字、字母和下划线,某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

2.3.1 $* 和 [email protected] 的区别

$* 和 [email protected] 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"[email protected]" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\[email protected]=" [email protected]
echo "\"\[email protected]\"=" "[email protected]"

echo "print each param from \$*"
for var in $*
do
    echo "$var"
done
echo "print each param from \[email protected]"
for var in [email protected]
do
    echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "print each param from \"\[email protected]\""
for var in "[email protected]"
do
    echo "$var"
done

输出

[[email protected] testShell]# ./tsbl.sh a b c
$*= a b c
"$*"= a b c
[email protected]= a b c
"[email protected]"= a b c
print each param from $*
a
b
c
print each param from [email protected]
a
b
c
print each param from "$*"
a b c
print each param from "[email protected]"
a
b
c

2.3.2 退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

2.4 Shell替换

2.4.1 转义字符

如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

a=10
echo -e "Value of a is $a \n"
echo "Value of a is $a \n"

输出

[[email protected] testShell]# ./myShell.sh
Value of a is 10 

Value of a is 10 \n

常用转义字符如下

2.4.2 变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"

echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"

unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"

var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"

echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

结果

[[email protected] testShell]# ./myShell.sh
Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set

3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

原文地址:https://www.cnblogs.com/zjfjava/p/9164085.html

时间: 2024-10-08 14:01:59

(一)Linux Shell编程——简介、变量的相关文章

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

第二章 Shell编程之变量

Shell编程之变量 一 Bash变量与变量分类 Bash是Linux中的标准Shell,因此经常称Bash为Shell. 1. 变量命名规则 变量名可以由字母.数字.下划线组成,但必须以字母与下划线开头: 变量名的长度不能超过255个字符: 变量名在有效范围必须唯一: 在Bash中,变量的默认类型都字符串型: 2. 变量按照存储类型分类 默认类型是字符串型. 字符串型,赋值时单双引号皆可: 整形: 浮点型: 日期型: 二 用户自定义变量 变量名与变量值都是用户自定义的,就是说可以由用户控制修改

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

Linux Framebuffer编程简介

linux下,framebuffer设备文件名通常是/ dev/fb0,1,2等.控制framebuffer设备的一般步骤如下:1) 打开设备,映射framebuffer2)依照硬件要求,准备好数据3)把数据复制到framebuffer例子程序如下:1)打开设备,映射framebufferstatic void *fbbuf;int openfb(char *devname){    int fd;    fd = open(devname, O_RDWR);    if (ioctl(fd,

Shell编程 之 变量设置时的不同模式

未命名 #!/bin/bash#======================================================#文件:var_test.sh#作者:daojoo, [email protected]#作用:测试变量设置时的不同模式#版本:1.0#日期:2012年03月09日 星期五 10时41分39秒#======================================================   #---------------变量设置时的不同模式

Linux Shell 编程实战技巧

目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞争力的技能.本文就笔者的实际开发经验,以 Korn Shell 为例分享了脚本开发中的常见问题及相关技巧. 避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇

关于linux shell编程,alias rm=&#39;cp [email&#160;protected] ~/backup; rm [email&#160;protected]&#39;

书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp [email protected] ~/backup; rm [email protected]' rm text.txt被转换成了cp  [email protected] ~/backup; rm [email protected] text.txt即cp  ~/backup; rm  text.txt可以看到text.

(20)linux shell编程

1.什么是shell Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell Shell也是一门编程语言<解释型的编程语言>,即shell脚本 一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的 2.Shell脚本的执行方式 (1)第一种:输入脚本的绝对路径或相对路径 首先要赋予+x权限 /root/helloWorld.sh ./helloWorld.sh 或