首页 > 系统相关 >Shell编程规范与变量

Shell编程规范与变量

时间:2024-05-25 11:55:01浏览次数:26  
标签:Shell 变量 编程 echo sh bash root localhost first

一:第一个shell脚本

1:shell的作用

[root@localhost ~]# cat /etc/shells

2:编写第一个shell脚本

[root@localhost ~]# vi first.sh

cd /boot/

pwd

ls -lh vml*

[root@localhost ~]# chmod +x first.sh

[root@localhost ~]# ./first.sh

[root@localhost ~]# vi first.sh

#!/bin/bash

#this is my first shell script

cd /boot/

echo "当前的目录位于:"

pwd

echo "其中以vml开头的文件包括:"

ls -lh vml*

[root@localhost ~]# ./first.sh

[root@localhost ~]# sh first.sh

[root@localhost ~]# bash first.sh

[root@localhost ~]# . first.sh

[root@localhost ~]# source first.sh

注释:“./”、sh、bash是相同的执行方式,“.”和source是相同的

source和“.”执行脚本时,将脚本中语句在本shell中执行,

sh、bash和./是在执行脚本时先启动一个新的shell,然后让脚本中的语句在新的shell中执行,执行完后就退出。

二:重定向与管道操作

1:重定向

1):重定向输出

[root@localhost ~]# uname -p > kernel.txt

[root@localhost ~]# cat kernel.txt

[root@localhost ~]# uname -r >> kernel.txt       \\追加并保存,不覆盖原有的数据

[root@localhost ~]# cat kernel.txt

扩展:

[root@localhost ~]# sed -i '1a\aaa' 123.txt   #在第一行的下一行添加文字

[root@localhost ~]# sed -i '1i\aaa' 123.txt    #在第一行的上一行添加文字

2):重定向输入

[root@localhost ~]# echo "123456">pass.txt

[root@localhost ~]# useradd aaa

[root@localhost ~]# passwd --stdin aaa <pass.txt       \\selinux要设置为disabled

[root@localhost ~]# echo aptech | passwd --stdin aaa    \\不用关闭selinux

3):重定向错误

[root@localhost ~]# tar jcf /nonedir/etc.tgz /etc/ 2>error.log

[root@localhost ~]# cat error.log

案例:

[root@localhost ~]# vi httpd_install.sh

#!/bin/bash

# 自动编译安装httpd服务器脚本

tar zxvf httpd-2.4.25.tar.gz &>/dev/null

cd httpd-2.4.25

yum -y install gcc apr-devel apr-util apr-util-devel pcre-devel

./configure --prefix=/usr/local/httpd --enable-so &>/dev/null

make &>/dev/null

make install &> /dev/null

echo "正在安装,请稍后......"

echo "http test">/usr/local/httpd/htdocs/index.html

/usr/local/httpd/bin/apachectl start >/dev/null

curl 127.0.0.1 

[root@localhost ~]# chmod +x httpd_install.sh

[root@localhost ~]# ./httpd_install.sh

2:管道操作

[root@localhost ~]# grep "/bin/bash$" /etc/passwd           \\以bash结尾的行

[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'

[root@localhost ~]# df -hT

[root@localhost ~]# df -hT | grep "/$" | awk '{print $6}'    #根目录下磁盘利用率

三:使用shell变量

变量名不能用数字开头

变量名中不能有小数点

变量名不能用纯数字

变量名可以是字母开头再加数字,或下划线开头加字母或数字

变量名中不能有斜杠“/”、“$”、“#”、“@”等特殊符号

等号前后不能加空格

1:自定义变量

[root@localhost ~]# name=benet

[root@localhost ~]# version=5.0

2:查看和引用变量的值

[root@localhost ~]# echo $name

benet

[root@localhost ~]# echo $name$version

benet 5.0

[root@localhost ~]# echo $name4.5           \\错误的引用

.5

[root@localhost ~]# echo ${name}4.5

benet4.5

注意:引用变量时如果变量名后有其他的字符,要将变量名应大括号引起来,用以定界

3:变量赋值的特殊操作

1):双引号

双引号可用于字符串的声明,双引号中的$符号或当做变量进行输出。连续的字符可以省略双引号,字符串中有空格的话就不能省略,另外,声明的变量值中如果要引用另一个变量,也需要双引号。

[root@localhost ~]# name=benet 5.0        \\错误的赋值

bash: 5.0: command not found

[root@localhost ~]# namet="benet 5.0"

[root@localhost ~]# echo $name

[root@localhost ~]# accp="accp $version"

[root@localhost ~]# echo $accp

accp 5.0

2):单引号

单引号用于原样输出的变量声明,意思是变量的值中需要保留显示$符号

[root@localhost ~]# accp='accp $version'

[root@localhost ~]# echo $accp

accp $version                     \\单引号中不能再引用变量,因此此处是错误的输出

3):反撇号

反引号用于命令的引用,相当于$(),区别在于反引号不能嵌套,而$()可以嵌套

[root@localhost ~]# ls -lh `which useradd`

[root@localhost ~]# aaa=`grep -v "^#" /etc/profile`

[root@localhost ~]# echo $aaa

[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))

备注:

-qf:查找该文件属于哪一个已安装的软件包

-qc:列出该软件包生成的所有文件

4):read命令

[root@localhost ~]# read todir1

/opt/backup/                \\用户输进去的

[root@localhost ~]# echo $todir1

/opt/backup/

[root@localhost ~]# read -p "请制定备份存放的目录:" todir2

请制定备份存放的目录:/opt/backup

[root@localhost ~]# echo $todir2

/opt/backup

综合案例

[root@localhost ~]# vi httpd_install.sh

#!/bin/bash

# 自动编译安装httpd服务器脚本 

read -p 请输入源码包的目录: mydir

cd $mydir

read -p 请输入软件包的名字: pack

tar zxvf ${pack}*.tar.gz &>/dev/null

cd /$mydir/${pack}* 

./configure --prefix=/usr/local/$pack &>/dev/null

make &>/dev/null

make install &> /dev/null

/usr/local/httpd/bin/apachectl start

firefox 127.0.0.1

[root@localhost ~]# chmod +x httpd_install.sh

[root@localhost ~]# ./httpd_install.sh 

4:设置变量的作用范围

1):例1

[root@localhost ~]# echo "name $version"

product 5.0

[root@localhost ~]# bash

[root@localhost ~]# echo "name$version"

product

[root@localhost ~]# exit

exit

[root@localhost ~]# echo "name$version"

product 5.0

2):例2

[root@localhost ~]# echo "name$version"

name5.0

[root@localhost ~]# echo "$name$version"

benet 5.0

[root@localhost ~]# export name version \\导出为全局变量

[root@localhost ~]# bash

[root@localhost ~]# echo "$name$version"

benet 5.0

[root@localhost ~]# exit

exit

3):例3

[root@localhost ~]# export fqdn="www.benet.com"

[root@localhost ~]# echo $fqdn

5:数值变量的运算

[root@localhost ~]# x=35

[root@localhost ~]# y=16

[root@localhost ~]# expr $x+$y

35+16

[root@localhost ~]# expr $x + $y

51

[root@localhost ~]# expr $x - $y

19

[root@localhost ~]# expr $x \* $y

560

[root@localhost ~]# expr $x / $y

2

[root@localhost ~]# expr $x % $y

3

[root@localhost ~]# Ycube=`expr $y \* $y \* $y`

[root@localhost ~]# echo $Ycube

4096

[root@localhost ~]# a=2

[root@localhost ~]# echo $((a*3))

6

[root@localhost ~]# echo $((a**3))   #3次方

8

四:特殊的shell变量

1:环境变量

set命令也可以显示环境变量,它显示的是系统中所有的环境变量,包括全局变量和局部变量

env只显示全局变量

[root@localhost ~]# env

[root@localhost ~]# ls -lh /root/first.sh

[root@localhost ~]# echo $PATH

[root@localhost ~]# first.sh

bash: first.sh: command not found

[root@localhost ~]# PATH="$PATH:/root"

[root@localhost ~]# echo $PATH

[root@localhost ~]# first.sh

/boot

[root@localhost ~]# vi /etc/profile

修改

export HISTORYSIZE=20

[root@localhost ~]# history | wc -l

89

[root@localhost ~]# source /etc/profile

[root@localhost ~]# history | wc -l

20

2:位置变量

[root@localhost ~]# vi adder2num.sh

#!/bin/bash

SUM=`expr $1 + $2`

echo "$1 + $2 = $SUM"

[root@localhost ~]# chmod +x adder2num.sh

[root@localhost ~]# ./adder2num.sh 12 14

12 + 14 = 26

3:预定义变量

$# 传送给命令Shell的参数个数

$- 在Shell启动或使用set命令时提供选项

$? 上一条命令执行后返回的值

$$ 当前shell的进程号

$! 上一个子进程的进程号

$@ 所有的参数,每个都用双括号括起

$* 所有参数,用双括号括起

$n 位置参数值,n表示位置

$0 当前shell名

备注:

$@:输出所有参数,把输出的参数当做一个个独立的单词,便于遍历所有的参数

$*:输出所有参数,把所有输出的参数当做一个整体。

这两个变量在输出时,视觉上是一样的,但存储方式不一样

(1)例1

[root@localhost ~]# vi mybak.sh

#!/bin/bash

TARFILE=beifen-`date +%s`.tgz

tar zcf $TARFILE $* &> /dev/null

echo "已执行 $0 脚本,"

echo "共完成 $# 个对象的备份"

echo “具体内容包括: $*”

[root@localhost ~]# chmod +x mybak.sh

[root@localhost ~]# ./mybak.sh /boot/grub

已执行 ./mybak.sh 脚本,

共完成 1 个对象的备份

“具体内容包括: /boot/grub”

[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow

已执行 ./mybak.sh 脚本,

共完成 2 个对象的备份

“具体内容包括: /etc/passwd /etc/shadow”

[root@localhost ~]# ls -lh beifen-*

-rw-r--r--. 1 root root 101K 12月  1 22:36 beifen-1448980601.tgz

-rw-r--r--. 1 root root 1.1K 12月  1 22:37 beifen-1448980640.tgz

(2)例2

[root@localhost ~]# vi adder2num.sh

#!/bin/bash

SUM=`expr $1 + $2`

echo "$1 + $2 = $SUM"

echo $0

echo $#

echo $*

echo $@

标签:Shell,变量,编程,echo,sh,bash,root,localhost,first
From: https://blog.csdn.net/weixin_71499831/article/details/139195151

相关文章

  • 实验 2 Scala 编程初级实践
    一实验目的二实验平台三实验内容和要求1、计算级数   2、模拟图形绘制traitDrawable{defdraw():Unit=println(this.toString)}caseclassPoint(varx:Double,vary:Double)extendsDrawable{defshift(X:Double,Y:Double):Unit={x+=X......
  • JavaScript入门指南:从零开始你的编程之旅
        JavaScript是现代web开发不可或缺的一部分,作为一种强大且灵活的编程语言,它可以在浏览器中运行,为网页添加互动功能。无论你是完全的初学者,还是有其他编程语言的基础,本文将引导你从零开始学习JavaScript。我们将涵盖基础知识、关键概念和实践技巧,帮助你迅速上手并......
  • 【pyspark速成专家】5_Spark之RDD编程3
    目录​编辑六,共享变量七,分区操作六,共享变量当spark集群在许多节点上运行一个函数时,默认情况下会把这个函数涉及到的对象在每个节点生成一个副本。但是,有时候需要在不同节点或者节点和Driver之间共享变量。Spark提供两种类型的共享变量,广播变量和累加器。广播变量是......
  • Python异步编程之基础概念
    Python异步编程之基础概念在现代编程中,异步编程是一种重要的技术,尤其是在处理I/O密集型任务时,异步编程可以大大提高程序的性能和响应速度。本文将介绍Python异步编程的基础概念,帮助你理解其原理和应用。什么是异步编程?异步编程是一种并发编程模型,它允许程序在等待某些任......
  • 深入解析Python并发的多线程和异步编程
    在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别是在处理I/O密集型任务时。Python提供了threading模块,使得多线程编程变得相对简单。本文将深入探讨threading模块的基础知识,并通过实例演示多线程的应用。1.多线程基础概念在开始之前,让我们......
  • python核心编程
    python核心编程一、python函数1.1函数的概念1.2函数的基本使用1.3函数的参数1.3.1单个参数1.3.2多个参数1.3.3不定长参数1.3.4缺省参数1.3.5参数注意1.4函数的返回值1.5函数的使用描述1.6函数的作用域1.7相关函数1.7.1偏函数1.7.2高阶函数1.7.3返回函数1......
  • Shell编程完成用户注册登录
    目录需求1.menu界面welcome(1)注册用户(2)用户登录(3)退出2.注册用户(1)用户名(首字母大写)(2)密码(8位及其以上必须有三个字符其中一个以上如:&$_隐试密码)(3)手机号码(必须以139开头)(4)邮箱邮箱名数字开头@qq.com(5)检测是否重名,重手机号和邮箱(6)不重名、手机号、邮箱写入......
  • 分布式计算编程项目二
    利用RPC技术实现一个学生信息管理系统目录利用RPC技术实现一个学生信息管理系统一、具体要求二、相关理论理论迭代1.单机结构2.集群结构3.微服务结构微服务介绍RPC介绍使用到的相关包MySQL启动方法三、代码架构四、功能实现+界面展示基本功能:技术点:1.查询速度提高2.数据模型和......
  • WinSock 的多线程编程
    目录概述Winsock为什么需要多线程阻塞模式和非阻塞模式单线程和多线程的优缺点Win32系统下的多进程多线程机制进程和线程线程创建线程同步线程通信  VC++对多线程网络编程的支持MFC中的多线程支持ATL中的多线程支持多线程FTP客户端实例头文件包含线......
  • Windows环境变量的优先级?
    起因今天用python的时候查了一下version,发现并不是我想用的版本,之前装的是3.10,但是跳出来一个3.11。眉头一皱,事情并不简单。第一个想法就是有什么程序偷偷给我装了其他版本的python还覆盖了路径。寻找去环境变量里寻摸一圈,发现事情并不简单,系统变量和用户变量里只有我自己配的......