Shell命令和基础学习
温馨提示:这篇文章已超过384天没有更新,请注意相关的内容是否还可用!
Shell的作用:
- 解释执行用户输入的命令或程序等
- 用户输入一条命令,shell就解释一条
- 键盘输入命令,Linux就给出响应的方式,称为交互式
外层应用程序 -> shell解释器 -> 操作系统核心 -> 机器硬件
(图片来源网络,侵删)shell脚本:
windows中存在".bat"批处理脚本
linux 中常用".sh"脚本文件
SheBang:
计算机程序中,shebang指的是出现在文本文件第一行前两个字符: #!
在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令,例如:
- 以 #! /bin/bash 或 #! /bin/sh 开头的文件,程序在执行的时候会调用/bin/sh,也就是bash解释器
- 以 #! /usr/bin/python 开头的文件,代表指定python解释器执行
- 以 #! /usr/bin/env 开头的文件,是一种在不同平台上都能正确找到解释器的办法
sh和bash一样的。
执行shell
- sh hello.sh
- hello.sh(PATH里没有)
- ./hello.sh(权限不够,添加权限: chmod +x hello.sh)
- /bin/bash ./hello.sh 或 /bin/sh ./hello.sh
bash/sh ,文件本身没权限执行,没x权限,则使用的方法,或脚本未指定shebang,重点推荐的方法
使用 绝对/相对 路径执行脚本,需要文件含有x权限
source script.sh / . script.sh 代表当前会话执行,bash/sh 生成一个子sh执行
少见的用法:sh
定义
shell语言定义的变量,数据类型默认都是字符串,弱类型语言
作用域
- 环境变量(全局变量):eg:$PATH
- 局部变量,针对 shell函数 或 shell脚本 的参数
脚本:
特殊状态
# 上一次命令执行状态返回值, 0正确,非0失败 $? # 当前shell脚本的进程号 $$ # 上一次后台进程的PID $! # 上次执行的命令,最后一个参数 $_ # 获取参数个数 $# # 获取参数第几个 #1 #2 #3 ... # 执行脚本名称 #0
变量
#支持的shell cat /etc/shells #定义变量,变量和值直接不能有空格,只能包括数字、字母、下划线,不能以数字开头,严格区分大小写 name="hello" # '' 不识别特殊符号,""识别特殊符号,""里变量的{}不能省略 nane1='${name}' # '${name}' name2="${name}" # hello echo ${name} = echo $name # 生成子shell,退出 exit sh #上一条命令是否成功: 0代表成功,否则失败 $?历史命令
# 查看历史命令 history #保留用户命令的个数 echo $HISTSIZE #查看历史文件 echo $HISTFILE #/root/.bash_history cat /root/.bash_history #清空历史命令 history -c #恢复历史命令 history -r #执行命令 !550 #执行上一个命令 !!
简单执行
[ $# -lt 2 ] && { echo "=2个参数" # 参数个数小于2个输出 "=2个参数"bash一些基础的内置命令
echo -n do not append a newline 不换行输出 -e enable interpretation of the following backslash escapes 启用下划线转义字符: 能够识别特殊字符 -E explicitly suppress interpretation of backslash escapes 不启用反斜线转义的解释(默认) 使用选项-e时,如果在字符串中键入以下字符,程序不用将它当一般字符输出,而是使用转义功能 \a 发出一个警告 \b 删除前一个字符 \c 最后不加换行符,并抑制字符后输出 \f 换行,但光标仍停留原来的位置 \n 换行,光标移到行首 \r 光标移到行首,但不换行 \t 水平制表符 \v 垂直制表符 \\ 插入\字符 \0nnn 插入nnn(八进制)所代表的ASCII字符,nnn代表0-3位八进制数字 \xHH 插入HH(十六进制)所代表的ASCII字符,HH代表1-2位十六进制数字 [root@192_168_52_88 test]# echo "Today is sunny" Today is sunny [root@192_168_52_88 test]# echo -e "Today \bis \bsunny" Todayissunny [root@192_168_52_88 test]# echo -e "Today is \csunny" #Today is [root@192_168_52_88 test]# [root@192_168_52_88 test]# echo -e "Today is sunny\nlo" Today is sunny lo [root@192_168_52_88 test]# echo -e "Today \ris sunny" is sunny #回车,光标移到首位,但不换行 eval exec export read shift字符串
截取字符串: # 截取左边的 % 截取右边的字符串 # 左边匹配第一个;## 右边匹配第一个 % 右边匹配第一个;%% 左边匹配第一个 file=/dir1/dir2/dir3/my.file.txt # 长度 ${#file} # 删掉第一个/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file#*/} # 删掉最后一个/及其左边的字符串:my.file.txt ${file##*/} # 删掉第一个.及其左边的字符串:file.txt ${file#*.} # 删掉最后一个.及其左边的字符串:txt ${file##*.} # 删掉最后一个/及其右边的字符串:/dir1/dir2/dir3 ${file%/*} # 删掉第一个/及其右边的字符串:(空值) ${file%%/*} # 删掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file ${file%.*} # 删掉第一个.及其右边的字符串:/dir1/dir2/dir3/my ${file%%.*} # 对比,少一个/ 引起是否匹配问题 # /dir2/dir3/my.file.txt echo ${file#/d*1} # /dir1/dir2/dir3/my.file.txt echo ${file#d*1} # ${var:start:length} # 提取最左边的5个字节:/dir1 ${file:0:5} # 提取最后5个字节(注意-5前有空格):e.txt ${file: -5} # 去掉头部5字节、尾部5个字节:/dir2/dir3/my.fil ${file:5: -5} # 先取最后11个字节,再去掉最后4个字节:my.file ${file: -11: -4} 字符串替换,不写入原变量 # ${var/ / } ${var// / } # 将第一个dir替换为path:/path1/dir2/dir3/my.file.txt ${file/dir/path} # 将全部dir替换为path:/path1/path2/path3/my.file.txt ${file//dir/path}
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
