Linux與Shell 第2天 實操、軟體包管理、Shell程式設計

迷路的哨兵甲發表於2024-04-17

傳送門

Linux與Shell 第0天 阿里雲安裝Ubuntu22.04以及桌面
Linux與Shell 第1天 檔案目錄、VIM、網路配置、系統管理、遠端登入
Linux與Shell 第2天 實操、軟體包管理、Shell程式設計

實操

菜鳥教程 Linux命令大全

檔案目錄

輸入 作用
ls -a 顯示隱藏檔案
ls -lh 詳細資訊
cd - 回到上一次所在目錄
cd -P 跳轉到實際物理路徑,而非快捷方式路徑
mkdir/rmdir 建立/刪除空目錄
cp -r 遞迴複製
mv 移動
touch 新建檔案,已存在則更新時間戳
cat/more/less 檢視
head/tail -n (數字) 檢視頭部/尾部(數字)行
ln -s 檔案路徑 連結快捷方式名 “建立快捷方式”
history -c 清楚history裡的記錄

關於檢視檔案
cat 命令會將整個檔案的內容一次性輸出到螢幕上,適合檢視較小的文字檔案
more 命令也用於分頁顯示檔案內容,但與 cat 不同,它會逐頁顯示檔案內容,而不是一次性顯示整個檔案,空格檢視下一頁
less 允許向前和向後瀏覽檔案內容,支援搜尋、跳轉等操作

輸出重定向

ls -l > a.txt # 列表的內容寫入檔案 a.txt 中(覆蓋寫)
ls -l >> a.txt # 列表的內容寫入檔案 a.txt 中(末尾追加)
cat 檔案1 > 檔案2 #將檔案1的內容覆蓋到檔案2

在 ll -lh 命令輸出中
-rwxrw-r--
第一個字元指示檔案型別:- 表示普通檔案。d 表示目錄。l 表示符號連結(symlink)。c 表示字元裝置檔案。b 表示塊裝置檔案。s 表示套接字(socket)。p 表示命名管道(FIFO)
接下來的九個字元表示檔案許可權,按順序分為所有者、所屬組、其他使用者

日期時間

輸入 作用
date "+%s" 時間戳 秒級別
date "+%s%3N" 時間戳 毫秒級別 %3N是取納秒部分的前三位作為毫秒
date "+%Y-%m-%d %A %H:%m:%S" 格式化顯示 2024-03-20 星期三 16:03:24
cal 顯示日曆

使用者管理

調整允許root登入

sudo vim /etc/ssh/sshd_config

PermitRootLogin no

sudo systemctl reload sshd
輸入 作用
useradd 使用者名稱 新增使用者
userdel -r 使用者名稱 刪除使用者,以及home下的資料夾
id 使用者名稱 使用者資訊
groupadd 組名 新增組
groupdel 組名 刪除組
groupmod -n 新組名 舊組名 新增組
usermod -g 組名 使用者名稱 把使用者改到組下
getent group | grep 組名 檢視組資訊

檔案許可權

chmod三個數字對應 所有者、所屬組、其他使用者
0-無許可權、1-執行(x)、2-寫入(w)、3-執行+寫入(wx)、4-讀取(r)、5-執行+讀取(rx)、6-執行+讀取(wr)、7-全部(rwx)

賦權物件
u: 所有者 (user) 預設是這個
g: 所屬組 (group)
o: 其他使用者 (others)
a: 所有使用者

chmod -R 遞迴賦權資料夾下的內容

chown username \home\a.txt 改變所有者
chgrp usergroup \home\a.txt 改變所屬組

搜尋查詢

find 目錄 -name/user/size 檔名 | 按照名稱/所屬使用者/檔案大小 在目錄下搜尋檔案 檔名*匹配多個?匹配單個
grep -A 10 "XXXXXXXX" httpClient.log 查日誌內容前後十行

壓縮

# 壓縮單個檔案
tar -zcvf nginx.tar.gz nginx.conf
# 壓縮多個檔案
tar -zcvf nginx.tar.gz nginx.conf nginx.conf2
# 解壓檔案
mkdir tmp
tar -zxvf nginx.tar.gz -C tmp/

磁碟分割槽

檢視磁碟容量 df -h
檢視檔案佔用磁碟塊大小 du -h

程序執行緒

ps aux | grep XXX
ps -ef | grep XXX
pgrep -f "xx" 找某個程序的pid

top
-p 透過指定程序ID來僅僅監控某個程序的狀態
-i 使top不顯示任何閒置或者僵死程序
top互動操作

  • P 以CPU使用率排序,預設就是此項
  • M 以記憶體的使用率排序
  • N 以PID排序
  • q 退出top
  • u 根據指定使用者進行過濾
  • k 直接殺死

根據埠號查詢程序
netstat -tlnp | grep 3658
根據程序ID查詢埠號佔用情況
netstat -nlp | grep 12564 | grep LISTEN

軟體包管理

Ubuntu換源

cat /etc/apt/sources.list
# 可能有cloud-init干涉 會提示去/etc/apt/sources.list.d新增自定義的源
touch /etc/apt/sources.list.d/mylist.list

常用命令

# CentOS
yum list | grep firefox
yum remove firefox
yum -y install firefox
# Ubuntu
apt search firefox
sudo apt remove firefox
sudo apt install firefox

Shell程式設計

Shell是一個命令直譯器,它接收應用程式/使用者命令,然後呼叫作業系統核心。

還是用python吧,庫多而且程式設計語法更簡潔

執行

bash包含sh,現在預設都是使用bash

echo $SHELL

/bin/bash

chmod賦權

chmod +x helloworld.sh
# 等價於 chmod u+x helloworld.sh

變數

env檢視系統變數,常用的系統變數有
HOME、PWD、SHELL、USER

  • 只包含字母、數字和下劃線: 變數名可以包含字母(大小寫敏感)、數字和下劃線 _,不能包含其他特殊字元。
  • 不能以數字開頭: 變數名不能以數字開頭,但可以包含數字。
  • 避免使用 Shell 關鍵字: 不要使用Shell的關鍵字(例如 if、then、else、fi、for、while 等)作為變數名,以免引起混淆。
  • 使用大寫字母表示常量: 習慣上,常量的變數名通常使用大寫字母,例如 PI=3.14。
  • 避免使用特殊符號: 儘量避免在變數名中使用特殊符號,因為它們可能與 Shell 的語法產生衝突。
  • 避免使用空格: 變數名中不應該包含空格,因為空格通常用於分隔命令和引數。
# 賦值語句等號左右不能有空格
# 單引號不會解釋 ${變數} 的值
new_var='1234'
# ${#string} 輸出字串的長度
# ${string:1:4} 擷取字串從索引位置1開始,取4個字元

# bash本身不支援浮點數,需要藉助bc(Basic Calculator),或者用Python代替
echo "3.14 * 2.5" | bc

# 整型、普通陣列、關聯陣列(Map)
# declare -i num
num=10

# declare -a my_array
my_array=(a b c d)
echo ${my_array[0]}
echo ${my_array[*]}
# ${#my_array[*]} 陣列長度

# declare -ai my_int_array
my_int_array=(1 2 3 4 5)
my_int_array=(
    2
    3
    4
    5
    6
)

# declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30
# 全部value
echo ${associative_array[*]}
# 全部key
echo ${!associative_array[*]}

# $ 或者 ${} 都可以使用變數 當可能出現歧義時需要花括號
for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done
# $(命令) 可以執行命令
# 注意迴圈和if的語法 if的[]內部也要有空格 且if-else分支下的內容不能為空
# [] 裡的 -o || 代表or -a && 代表and
for file in $(ls ~/Desktop); do
	echo $file
done

if [ $a == $b ]; then
   echo "a 等於 b"
elif [ $a == $c ]; then
   echo "a 等於 c"
else
    echo "其他"
fi

# 只讀變數,不可再被修改
readonly read_var
# 刪除變數,只讀變數無法刪除
unset del_var



# 函式 如果return則return值必須0-255 沒有return以最後一句作為return的內容(更靈活)

function add(){
        s=$[$1+$2]
        echo "sum結果是$s"
}
read -p "請輸入第一個整數" a
read -p "請輸入第二個整數" b
sum=$(add $a $b)
echo "sum=$sum"

可以使用 $1、$2 等來引用傳遞給指令碼的引數,其中 $1 表示第一個引數,$2表示第二個引數,注意 $0 為執行的檔名

相關文章