Shell 脚本和编程| 青训营笔记

108 阅读2分钟

这个老师声音好好听啊,虽然温柔到听到快要睡着,但是还是听了。

shell基础概念

shell脚本是一种脚本语言,它可以用来编写一系列的命令,以实现自动化的任务。Shell脚本是一种用Shell语言编写的脚本程序,它通常用于执行一系列命令,从而完成特定的任务。在Unix或Linux系统中,Shell脚本通常使用扩展名为.sh。

Shell脚本的核心是命令,这些命令包括Shell内置命令和系统命令。Shell内置命令是由Shell解释器本身提供的命令,例如cd、echo和pwd等。系统命令是由操作系统提供的命令,例如ls、cp和grep等。

除了替代 v6 shell,sh 还有几个优点,把控制流程,循环,变量引入了脚本,提供了一种更具功能性的语言主流 Linux 系统使用的 shell,许多都以它为锚点。 bash是 sh的超集Bash 在兼容 Bourne shell 脚本编程的同时,集成了Korn shell 和C shell 的功能,包括命令历史,命令行编辑,目录堆栈(pushd 和 popd),一些实用环境变量,命令自动补全等。

命令和语法

Shell脚本中的命令通常是一行一行输入的,每行命令以换行符结束。可以使用分号或者在同一行上输入多个命令来在一行中输入多个命令。

mkdir mydir; cd mydir

# 执行命令 
result=`ls -l` 
# 管道 
ls -l | grep .txt 
# 重定向 
ls -l > myfile.txt
# if语句 
if [ $myname == "p" ] 
then 
    echo "hello, world" 
fi 
# for语句 
for i in {1..10} 
do 
    echo $i 
done 
# while语句
counter=0 
while [ $counter -lt 10 ] 
do 
    echo $counter 
    counter=$((counter+1)) 
done

模块化

function_name() {
    command1
    command2
    ...
    commandN
    return
}

function add() {
    local sum=$(( $1 + $2 ))
    return $sum
}

在实际开发中,可以将一些常用的函数定义在一个文件中,然后在其他脚本中引用这个文件。例如,假设我们有一个utils.sh文件,其中定义了一个log()函数:

perl
function log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

我们可以在其他脚本中引用这个文件,然后调用log()函数输出日志:

bash
#!/bin/bash
source utils.sh

log "Starting..."

常用命令

  1. echo: 用于输出文本或变量的值。例如:echo "Hello World"将输出字符串"Hello World"。
  2. cd: 用于切换当前工作目录。例如:cd /home/user将切换到目录/home/user
  3. ls: 用于列出当前目录中的文件和子目录。例如:ls将列出当前目录中的所有文件和子目录。
  4. mkdir: 用于创建新的目录。例如:mkdir new_dir将在当前目录中创建一个名为new_dir的新目录。
  5. rm: 用于删除文件或目录。例如:rm file.txt将删除当前目录中的文件file.txt
  6. cp: 用于复制文件或目录。例如:cp file.txt /home/user将将文件file.txt复制到/home/user目录中。
  7. mv: 用于移动文件或目录,也可以用于文件或目录的重命名。例如:mv file.txt /home/user将将文件file.txt移动到/home/user目录中,或者使用mv file.txt new_name.txt将文件file.txt重命名为new_name.txt
  8. cat: 用于将文件内容输出到终端。例如:cat file.txt将输出文件file.txt的内容。
  9. grep: 用于在文件中查找指定的字符串。例如:grep "hello" file.txt将在文件file.txt中查找字符串"hello"。
  10. sed: 用于对文件进行编辑和替换操作。例如:sed 's/old/new/g' file.txt将将文件file.txt中所有的"old"字符串替换为"new"字符串。

执行过程和原理

调试

普通log,使用echo,printf

在Shell脚本中,最简单的调试方法就是输出一些变量或标志,以便了解代码的执行情况。可以使用echo或printf命令在控制台中输出一些信息,例如:

bash
echo "debug message: $variable"
printf "debug message: %s\n" "$variable"

使用set命令

可以使用set -x命令来打开调试模式,使用set +x命令来关闭调试模式。

set -x 
echo "debug message" 
set +x
set -x
echo "Hello, World!"
set +x
+ echo 'Hello, World!'
Hello, World!
+ set +x

vscode debug插件

前端集成

1. node中通过exec、spawn 调用 shell 命令

Node.js是一种非常流行的服务器端JavaScript平台,它提供了exec、spawn等函数来调用Shell命令或脚本。使用这些函数可以方便地实现Node.js与系统、网络等底层资源的交互。例如:

const { exec } = require('child_process');
exec('ls -al', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});

2.shell 脚本中调用node命令 Shell脚本可以通过调用Node.js命令来实现一些高级功能,例如网络请求、数据处理等。例如:

#!/bin/bash
curl -s https://api.github.com/repos/nodejs/node/releases/latest | node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).name'

这个脚本通过curl命令获取GitHub上Node.js最新版本的信息,并通过Node.js命令解析JSON字符串并输出最新版本号。

3.借助zx等库进行 javascript、shell script的融合

-借助shell 完成系统操作,文件io、内存、磁盘系统状态查询等

-借助nodejs 完成应用层能力,网络io、计算等 zx是一个轻量级的命令行工具,可以方便地实现JavaScript与Shell脚本的融合。使用zx,可以在JavaScript中直接调用Shell命令或脚本,同时也可以在Shell脚本中直接调用JavaScript函数。例如:

#!/usr/bin/env zx
const result = $`ls -al`
console.log(result.stdout)

这个脚本通过$ls -al命令调用Shell命令,并将结果输出到控制台。