網站首頁 編程語言 正文
什么是shell腳本?
Linux命令正常情況都是在命令行執行,如果將命令放到一個文件中執行,該文件就是一個shell腳本。從事linux系統工程師崗位,shell編程人員。
Shell就是一個普通文本文件,有一大堆的linux命令堆砌而成。一般以.sh為后綴。
Shell腳本不需要編譯,逐行執行。常見的shell解釋器有bash,dash,csh,ksh。
Shell腳本可以接受參數的。并且shell語法支持大部分流行編程語言的語法,循環語句,流程控制語句,支持函數。
可以理解shell腳本就是一種編程語言。
Shell腳本的編寫,執行和調試
編寫shell腳本
vim myshell.sh
如果當前目錄不存在myshell.sh則會新建文件
第一行是指定shell解釋器,#!/bin/sh
#是注釋,一個作用是描述信息,另外一個作用是注釋代碼,使某一行代碼失效。相當于java中的//
給腳本授予執行權限
shell的執行有兩種:
./name
sh name
shell的調試sh -x name
Shell變量
shell中沒有變量的類型,可以認為都是字符串
shell中的變量可以分四大類
- 本地變量:僅在當前的shell中生效,shell執行完之后失效。
- 環境變量:在當前shell和子shell都生效(export b),如果在子shell中定義,在父shell無法獲取。
- 位置參數變量: 函數或者腳本的參數相關 $1表示腳本的第一個參數,$n標識第N個參數
位置參數的作用:接收腳本的參數,接受函數的參數- 特殊變量:shell腳本自帶的
參數相關
$* 獲取所有參數,將所有的參數作為一個字符串。
$# 獲取參數的個數
$0 獲取shell腳本的名字
進程相關
$$ 顯示當前shell的進程號
$? 顯示上一條命令的返回值
命令和shell的返回值分類
0 正常返回(command not found)
127 命令不存在
126 沒有權限(Permission denied)
Shell中的函數
myfunction(){
echo "function body"
echo $1 $2
}
帶返回值的函數
function add(){
a=$1
b=$2
c=$(($a+$b))
return $c
}
調用函數
#!/bin/sh
. /home/shell/functions.sh
add 11 33
echo $?
shell腳本中的返回值默認0-255,必須是數字。
不建議直接返回計算的數值,將結果在函數內部打印
Shell中的數組
shell中只有一維數組,數組的下標從0開始。
定義方式
array_name=(value1 value2…) 注意,值之間的分隔符是空格
取值方式
array_name[0]=value1
獲取數組的內容
${myArr[*]} *可以換成@
獲取數組的長度
${#myArr[*]}
Shell常用命令
exit,退出命令,shell腳本默認退出值為0-255,0代表成功,1-255代表異常。
通過$?獲取退出代碼。
數據的定向
>> 和> 表示寫入
>>是追加內容
>是覆蓋內容
<<和< 表示讀入
通過shell腳本修改主機名
update_host_name.sh hostname
修改/etc/hostname的內容
方法一:使用寫入方式
#!/bin/sh
# this is update hostname
hostname=$1
echo $hostname > /etc/hostname
Reboot
方法二:使用讀入方式
#!/bin/sh
# this is update hostname
cat > /etc/hostname <<EOF
server03
EOF
Reboot
EOF是截止符,EOF之前的內容都會被定向到目標文件中。
方法二比方法一的有點在于,可以寫入多行。輸出日志到垃圾堆 >/dev/null 2>&1
Shell中的流程控制語句
Linux中的關系運算符
運算符 含義
- -eq 是否相等,相等返回true
- -ne 不相等,不相等返回true
- -gt 大于返回true
- -lt 小于返回true
- -ge 大于等于返回true
- -le 小于等于返回true
Linux中的布爾運算符
-a 的意思就是左右兩個條件都滿足相當于java中的&&
-o 的意思是左右兩個條件只要有一個滿足就行,相當于java中的||
文件測試運算符
測試linux操作系統的文件的屬性
-f (file)判斷文件是否存在并且是否是文件
-d (directory)判斷文件是否存在是否是目錄(cd aaa)
if語句
if 條件
then
滿足條件要執行的內容
fi
[]是條件判斷
elif相當于java中的elseif
while循環
let 可以使用expr代替 ,expr需要把變量的$加上
Let是linux中的一種算術計算工具。
for循環
練習: 根據應用名稱殺死對應的進程。
#!/bin/sh
if [ $# -eq 1 ]
then
app=$1
pid=`ps -ef | grep $app| grep -v grep| grep -v $0 | awk -F ' ' '{print $2}'`
echo $pid
kill -9 $pid
echo $1'已經被殺死了'
else
echo '請輸入一個參數例如:' $0 'tomcat'
fi
原文鏈接:https://blog.csdn.net/qq_60969145/article/details/127020910
相關推薦
- 2022-10-05 使用?Swift?Package?插件生成代碼的示例詳解_Swift
- 2022-08-17 VMWare虛擬機為Windows?Server?2008設置靜態IP的方法_VMware
- 2023-02-09 python如何尋找主串中所有指定子串下標_python
- 2023-07-25 使用Http請求調用第三方API
- 2022-07-10 TypeError: Cannot read property ‘forceUpdate‘ of u
- 2023-09-17 POM文件中使用<exclusions>解決jar沖突問題
- 2024-01-15 jquery獲取dom元素身上的綁定事件
- 2022-07-09 python連接clickhouse數據庫的兩種方式小結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支