Linux shell编程基础

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序,一般文件后缀为 .sh。

一、shell环境

Linux 环境下有很多可以使用的shell,每个用户都拥有一个特定的默认shell。在Linux系统中,/etc/shells文件用于指定哪些程序路径可以作为有效的登录shell。

Shell 的解释器种类众多,常见的有:

shell 解释器 说明
sh Bourne Shell。sh 是 Unix 标准默认的 shell。
bash Bourne Again Shell。bash 是 Linux 标准默认的 shell。
tcsh 整合 C Shell ,提供更多的功能
csh 已经被 /bin/tcsh 所取代
zsh 功能强大的 shell 与脚本语言。

要查看系统中允许的合法登录shell,可以执行以下命令:

bash 复制代码
cat /etc/shells

1.1 当前用户的默认shell

用户的"默认shell"是指他们登录系统后自动启动的命令行解释器或交互式shell。这个shell用于处理用户在命令行界面输入的命令和操作。

可以使用如下命令查看当前默认shell

bash 复制代码
echo $SHELL

1.2 修改当前用户默认shell

要更改用户的默认shell,可以在命令行中输入以下命令:

bash 复制代码
chsh -s <shell>

其中是你想要设置为用户默认shell的路径。例如,要将当前用户的默认shell更改为Bash,可以执行:

sh 复制代码
chsh -s /bin/bash

系统会要求你输入当前用户的密码以确认此操作。确认后,用户的默认shell将被更改为Bash。但是似乎修改失败了。

1.3 指定脚本解释器

shell脚本中,#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。#! 被称作shebang。

#! 决定了脚本可以像一个独立的可执行文件一样执行,而不用在终端之前输入sh, bash, python, php等。

指定 bash 解释器

bash 复制代码
#!/bin/bash
#!/usr/bin/env bash

1.4 shell 脚本执行方法

shell 脚本执行方法有多种,以如下helloworld.sh 为例

bash 复制代码
#!/bin/bash
echo "Hello, world!"

可以使用下面的命令让 shell 以非交互模式运行:

sh 复制代码
sh /path/to/script.sh
bash /path/to/script.sh
source /path/to/script.sh
./path/to/script.sh

其中,source /path/to/script.sh 和 ./path/to/script.sh 是等价的。

除此之外,你还可以通过chmod命令给文件添加可执行的权限,来直接执行脚本文件:

bash 复制代码
chmod +x /path/to/script.sh #使脚本具有执行权限
/path/to/test.sh

二、注释

注释可以说明你的代码是什么作用,以及为什么这样写。shell 语法中,注释是特殊的语句,会被 shell 解释器忽略。

单行注释 - 以 # 开头,到行尾结束。

多行注释 - 以 :<<EOF 开头,到 EOF 结束。

bash 复制代码
# echo '这是单行注释'

########## 这是分割线 ##########

:<<EOF
echo '这是多行注释'
echo '这是多行注释'
echo '这是多行注释'
EOF

三、shell 字符串输出

3.1 echo

echo用于字符串的输出。

输出普通字符串

bash 复制代码
echo "hello!"

输出含有变量的字符串

bash 复制代码
name=xiaoyuzhou
echo "hello, \"${name}\""

输出转义字符,需要使用-e参数。

bash 复制代码
# 输出含换行符的字符串
echo -e "first\nsecond"
# \c 不换行
echo -e "first \c"
echo "second"

3.2 printf 格式化输出字符串

printf 不会像 echo 一样自动添加换行符,如果需要换行可以手动添加 \n。

如下仿照ls -l 的输出格式,对文件夹信息进行打印输出

四、变量

Bash 中没有数据类型,bash 中的变量可以保存一个数字、一个字符、一个字符串等等。同时无需提前声明变量,给变量赋值会直接创建变量。

变量赋值时,等号左右不能有空格。访问变量的语法为:$var 或 ${var}。

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。

bash 复制代码
name="xiaoyuzhou"
gender="male"
echo ${name}
readonly name
# name="newname"  # 放开注释,执行报错
unset gender

五、环境变量

环境变量是对当前 shell 会话内所有的程序或脚本都可见的变量。创建它们跟创建局部变量类似,但使用的是 export 关键字,shell 脚本也可以定义环境变量。

常见的环境变量:

变量 描述
$HOME 当前用户的用户目录
$PATH 用分号分隔的目录列表,shell 会到这些目录中查找命令
$PWD 当前工作目录
$RANDOM 0 到 32767 之间的整数
$UID 数值类型,当前用户的用户 ID
$PS1 主要系统输入提示符
$PS2 次要系统输入提示符
相关推荐
titxixYY1 小时前
SElinux
linux·运维·服务器
香吧香2 小时前
getent使用小结
linux
麻瓜也要学魔法3 小时前
Linux关于vim的笔记
linux·笔记·vim
云边的快乐猫4 小时前
navicat远程连接虚拟机centos系统的mysql
linux·mysql·centos·虚拟机·navicat
望获linux4 小时前
在 ARM 平台上如何实现Linux系统的1秒启动
linux·服务器·开发语言·数据库·操作系统·嵌入式操作系统·arm平台
先天打工圣体的男人4 小时前
Linux中安装InfluxDB
linux·运维·服务器
dessler4 小时前
云计算&虚拟化-kvm-克隆(clone)虚拟机
linux·运维·云计算
陌小呆^O^5 小时前
CmakeList.txt之Linux-pthread
linux·运维·服务器
Sagice5 小时前
CVE-2019-13272(Linux本地内核提权)
linux·运维·服务器·网络·安全
Kendra9196 小时前
RHCE SELINUX安全管理
linux