shell基础命令入门

本文介绍了Linux系统的shell,它是用户与内核交互的接口,尤其是bashshell的使用。文章涵盖了shell脚本的编写,包括指定解析器、执行方式以及环境变量的管理。此外,还讲解了变量(全局与局部)、运算符、条件判断、流程控制结构如if和for循环,以及正则表达式和文本处理工具的使用。

shell概述

linux内核: kernal,最核心部分,直接操作硬件(cpu 内存 IO设备),但用户不友好

shell:解释层,底层和外部操作的一个接口。接受用户/应用程序命令,解释调用相应操作系统内核。本质上对于linux的操作都是基于shell的。同时,shell也是一个功能强大的编程语言,易编写调试,灵活性强。

查看linux提供的shell解释器:

cat /etc/shells

echo $SHELL

大多数默认的shell都是bash,redhat默认使用bash,bedian 默认用的是dash

Shell脚本入门

脚本默认后缀.sh 不写后缀也可以

#!/bin/sh 
# 指定脚本的解析器

脚本执行方式

bash scripts
# 脚本被当作bash参数传入,可以没有x权限
scripts 
# 直接执行脚本,需要添加可执行权限
chmos a+x scripts
# 为脚本添加可执行权限
. scripts
# 通过点命令执行
source .scripts
# 通过source执行

通过bash scripts 执行相当于,在当前的shell中打开一个子shell,把脚本中的语句拿出来逐句执行。

通过点命令和source命令执行时不重新打开一个子shell。

可能会存在子shell中环境变量与当前shell中不一致的问题,子shell中设置的变量在父shell中是不可见的。

ps -f
# 查看当前进程
bash
# 新建一个子进程 属于当前bash进程的子进程
. test.sh
# 在子进程里执行脚本,可以通过exit退出子shell

变量

用一个变量存放数据

系统预设变量

env printenv可以打印当前所有全局变量

echo $HOME 或 printenv HOME 打印该变量的值

常见系统预设变量

$HOME
$PWD
$SHELL
$USER

全局变量:适用于当前bash和所有子bash

局部变量:只针对当前bash,子bash也不能访问

set 可以查看当前定义的所有变量

用户自定义变量

定义修改变量 a=1,自定义的变量是局部变量, 可以通过export 提升为全局变量

定义的变量默认是字符串,不做运算,需要做运算可以使用运算符

在子bash对全局变量的更改只在当前bash生效,即便是声明后export (export不加$)

env | grep a
set | grep a

撤销变量 unset 变量名(不需要$)

只读变量 readonly 变量, 只读变量不能unset

特殊变量

$n 0代表脚本名称,1-9呆鸟1-9个参数,10以上的参数需要提娜佳{}  ${10}

单引号里的内容会原样输出,不会解析变量

#!bin/bash
echo $0
echo $1
bash test.sh hi
test.sh
hi

$# 获取当前输入参数的个数

$*命令行中所有参数,吧所有参数看作一个整体

$@命令行中所有参数,把每个参数分开对待

$?最后一次执行的命令的返回状态,0表示执行正确,非0表示执行错误

运算符

expr 1 + 2
# 必须有空格,相当于把1 + 2分别作为参数传给expr
# 乘法需要转义 \*
echo $((1+2))
echo $[1+2]

res=(($1+$2))
echo res

条件判断

test condition 条件判断

a=hello
test a = hello
echo $?
test a = hi
echo $?

[ $a = hello ]
echo $?
# []里不加空格会被识别为一个值,必然真

[ $a != hello ]

表达式为真返回0,假返回1

[] 判断前后一定要有空格

判断条件

  • shell中字符串之间的比较用=  !=
  • 整数之间用 -eq -ne -gt - ge -lt -le
  • 按文件权限判断 -r -w -x
  • 按文件类型判断 -e 文件存在 -f 存在的常规文件 -d 存在的目录
test -e test.sh
[ -e test.sh ]

test -x test.sh
[ -x test.sh ]

多条件判断

&&表示前一命令执行成功后,才执行后一条命令

|| 表示前一条命令执行失败后,才执行后一条命令

[ -x test.sh ] && echo ok
[ -x test.sh ] || echo ok

[ -x test.sh ] && echo ok || echo "not ok"

流程判断

if

if [ 2 -eq 2 ]; then
    echo hi
fi

if [ 2 -eq 2 ]
then
    echo hi
fi
if [ 2 -eq 3 ]; then
    echo 2=3
elif [ 2 = 4 ]
then
    echo 2=4
else
    echo nothing
fi

if [ $a -gt 18 ] && [ $s -lt 35 ]; then
    echo ok

if [ $a -gt 18 -a $a -lt 35 ]; then
    echo ok

case

case $1 in
'1')
    echo 1
;;
'2')
    echo 2
;;
*)
    echo nothing
;;
esac

for

for ((i=0;i<100;i++))
do
    ...
done

for os in linux windows macos; do echo $os; done

for i in {1...100}; do sum=${$sun+$i}; done; echo $sum

while

a=1
while [ $a -le $1 ]
do
    #sum=$[ $sum + $a ]
    #a=$[ $a +1 ]
    let sum2+=a
    let a++
done

read 读取控制台的输入

-p 读取值时的提示符

-t 指定读取等待时间,不加t默认一直等待

参数: 指定读取值的变量名

read -t 10 -p 'your name, please'
echo "welcome, $name"

函数

        date 显示时间 date +%s 显示时间戳

        $(date +%s)调用变量将返回值拼接

filename="$1_log_$(date +%s)"

./test.sh jack

系统函数

basename 会删掉所有前缀包括最后一个/ , 然后把字符串显示出来, 如果制定了suffix,会把字符串或路径中的后缀去掉。

basename 字符串/路径 后缀

适用于忽略路径,只关注文件名的场景

basename /home/aaa/test.txt 

# 返回 test.txt

basename /home/aaa/test.txt .txt

# 返回 test

dirname 返回路径最后/的部分

dirname /home/a/b/a/c/c/a/ctest.txt

#返回路径

自定义函数

[ function ]funcname[()]
{
    action
    [return int;]
}

funcname [value]
test.sh

function getSum() {
    s=0
    s=$[$1+$2]
    echo "$s"
}

read -p 'num1: ' n1;
read -p 'num2: ' n2;
sum $n1 $n2;


# 调用
getSum $n1 $n2

正则pattern

# 常规匹配
cat /etc/passwd | gerp test
# 以a开头
cat /etc/passwd | grep ^a
# 结尾
cat /etc/passwd | grep a$
# 匹配任意字符 root r**t
cat /etc/passwd | grep r..t
# 出现任意次数 匹配o的任意次数(包含0次)
cat /etc/passwd | grep ro*t 
# 匹配字符区间
cat /etc/passwd | grep [3-9]
cat /etc/passwd | grep [2,7]
cat /etc/passwd | grep [a-z]
cat /etc/passwd | grep [0-9]* 
cat /etc/passwd | grep [a-c, e-f]
# \ 转义 20$
cat /etc/passwd | grep '20\$'

文本处理工具

cut option filename

-f 列号,提取第几列

-d 分隔符,默认\ t 制表符,指定分隔符用于分隔列

-c 按照字符进行切割,后加n表示去第几列

__未完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值