Wilhel

Wilhel

SHELL工具和腳本

筆記#

$_    # 上一個參數
!!    # 上一條命令
$?    # 執行命令的結束代碼
$#    # 參數個數
$@    # 所有參數
$$    # SHELL本身的PID
$0    # 本身的檔案名

創建資料夾並進入資料夾

# mcd.sh
mcd(){
	mkdir -p "$1"
	cd "$1"
}

source mcd.sh
mcd test
# example.sh

#!/bin/bash
  
echo "Start program at $(date)" # 日期將被替換
 
echo "Running program $0 with $# arguments with pid $$"
 
for file in "$@";do
        grep foobar "$file" > /dev/null 2> /dev/null
        # 當未找到模式時,grep具有退出狀態
        # 我們將STDOUT和STDERR重定向到空寄存器..
        if [[ "$?" -ne 0 ]]; then
                echo "File $file does not have any foobar, adding one"
                echo "# foobar" >> "$file"
        fi      
done

查看命令如何使用:

  • tldr 更直白明了
sudo apt-get install tldr
mkdir -p ~/.local/share/tldr
tldr -u

查找文件

  • fd
sudo apt-get install fd-find
sudo ln -s $(which fdfind) /usr/bin/fd

查找代碼

  • riggrep(rg)
sudo apt-get install riggrep

# 查找所有使用了 requests 庫的文件
rg -t py 'import requests'
# 查找所有沒有寫 shebang 的文件(包含隱藏文件)
rg -u --files-without-match "^#!"
# 查找所有的foo字符串,並打印其之後的5行
rg foo -A 5
# 打印匹配的統計信息(匹配的行和文件的數量)
rg --stats PATTERN

通用模糊查找工具

  • fzf
sudo apt-get install fzf

ps aux | fzf
fzf --query "sh"

文件夾導航

  • fasd
  • autojump
  • tree
  • broot
  • nnn
  • ranger

練習#

保存當前位置

#!/bin/bash
marco(){
	echo $(pwd) > ~/dev/class/missing-semester/marco_history.log
	echo "save pwd $(pwd)"
}
polo(){
	cd "$(cat ~/dev/class/missing-semester/marco_history.log)"
}

#!/bin/bash
marco() {
	export MARCO=$(pwd)
}
polo() {
	cd "$MARCO"
}

調試錯誤並捕獲輸出

# buggy.sh

#!/usr/bin/env bash

n=$(( RANDOM % 100 ))

if [[ n -eq 42 ]]; then
        echo "Something went wrong"
        >&2 echo "The error was using magic numbers"
        exit 1
fi

echo "Everything went according to plan"

# debug_while.sh
#!/usr/bin/env bash
count=1

while true
do
        ./buggy.sh &>> out.log
        if [[ $? -ne 0 ]]; then
                # cat out.log
                echo "failed after $count times"
                break
        fi
        ((count++))
done

# debug_for.sh
#!/usr/bin/env bash
for ((count=1;;count++))
do
        ./buggy.sh &>> out.log
        if [[ $? -ne 0 ]]; then
                # cat out.log
                echo "failed after $count times"
                break
        fi
done

# debug_until.sh
#!/usr/bin/env bash
count=0
until [[ "$?" -ne 0 ]];
do
        count=$((count+1))
        ./buggy.sh &>> out.log
done
# cat out.log
echo "found error after $count runs"

遞歸地查找文件夾中所有的 HTML 文件,並將它們壓縮成 zip 文件

mkdir -p html_root/html
touch html_root/{1..10}.html
touch html_root/html/xxxx.html
fd --extension html | xargs -d '\n' tar -cvzf html.zip

編寫一個命令或腳本遞歸的查找文件夾中最近使用的文件

find -type f -print0 | xargs -0 ls -lt | head -1
# find -print0 在查詢的每一個結果後加一個NULL字符,替換默認的換行符
# xargs -0 xargs命令用NULL做分隔符
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。