Shell 和 Shell 脚本 (Shell Script)

2022-11-21 15:38:30 浏览数 (1)

Shell 是一个用 C 语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

业界所说的 Shell 通常都是指 Shell 脚本,但要知道,Shell 和 Shell Script 是两个不同的概念。

Shell 脚本种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

除了上面的几种,Node.js 本质上也是一种 Shell 脚本,只不过他的语法是 JavaScript。不同 Shell 脚本的区别就是语法不一样。

总结:我们通过编写 Shell 脚本,然后放在 Shell 应用程序里面运行,常见的 Shell 应用程序有 Cmd、git Bash 等等。常见的Shell 脚本有 Bash、Node。

不同的 Shell 脚本需要不同的 Shell 应用程序来执行,默认 Shell 应用程序都是执行 Bash 脚本的,如果需要切换 Node 脚本的执行环境,我们需要安装 Node,配置完成环境变量后,输入node即可切换 Node 脚本的执行环境中。


Shell 脚本 - Bash

Bash 是大多数 Linux 系统默认的 Shell 脚本。

Bash Documents

Linux系统目录结构

目录文字说明

代码语言:javascript复制
mkdir demo
cd demo
mkdir css js
touch index.html css/style.css js/main.js
exit

脚本执行的原理(Bash 脚本)

你每次在 Shell 应用程序 里面输入一个命令时(比如 ls、cp、demo),Bash 都会去 PATH 列表里面寻找对应的文件,如果找到了就执行。

当我们自己写的脚本不在 PATH 列表里面应该怎么执行呢?比如我们写了一个名为 demo 的脚本。

第一种

代码语言:javascript复制
cd demo 脚本的目录
./demo

第二种

代码语言:javascript复制
脚本目录/demo

注意:如果我们直接在 Bash 里面输入 demo 的话,会发现执行不了,因为 demo 这个脚本不在 PATH 列表里。

查看脚本所在的 PATH

使用 type ls 可以看到寻找过程(在 Win 系统下好像没啥用)

使用 which ls 可以看到寻找结果

Shell 脚本 - Node

我们在 Bash 执行环境里输入 Bash 脚本,也可以在 Node 执行环境里输入 Node 脚本。

Bash 脚本能做的事情,JS 脚本也能做。(sh demo.sh 对应 node demo.js)

Node.js Document

查看当前目录

代码语言:javascript复制
process.cwd();

创建目录

代码语言:javascript复制
var fs = require('fs')
fs.mkdirSync("./demo")

创建文件

代码语言:javascript复制
var fs = require('fs')
fs.writeFileSync("./demo.txt","123")

注意点


脚本后缀

作用:毫无作用。

Linux 中的文件是通过敲命令来执行的,可以用vi demo通过 vi 来打开,也可以通过sh demo当做脚本来执行,默认是 sh


文末放一个案列:列如我写的一个脚本控制tcl tv压测netflix转dtv后blank screen

代码语言:javascript复制
while true;
do
    input keyevent 25  #声音降低
    input keyevent 25
    input keyevent 25
    echo 02f6 > /sys/venus_ir/ir_gen_keycode  #打开netflix
    sleep 2
    echo 0x1c > /sys/venus_ir/ir_gen_keycode  #确认片源
    sleep 1
    echo 0x1c > /sys/venus_ir/ir_gen_keycode  #确认播放
    sleep 3
    input keyevent 24  #声音升高
    input keyevent 24
    input keyevent 24
    sleep 1
    echo 01d7 > /sys/venus_ir/ir_gen_keycode  #切换tv
    sleep 2
    input keyevent 22  #左键
    sleep 1
    echo 0x1c > /sys/venus_ir/ir_gen_keycode  #确认切换到dtv
    sleep 10
    echo 0x66 > /sys/venus_ir/ir_gen_keycode  #返回主页
    sleep 1
done

获取键值方法一

控制键值

获取:dmesg -c |grep IR

代码语言:javascript复制
[ 2723.097758] 11:18:35.995 (3)-0000x09[IR] [DBG] roger venus_ir_input_report_end_TCL keycode=0x6c

[ 2723.097774] 11:18:35.995 (3)-0000x09[IR] [DBG] roger venus_ir_input_report_end_TCL keycode=0x6c up

实现:echo 0x6c > /sys/venus_ir/ir_gen_keycode

获取键值方法二

获取键值getevent

代码语言:javascript复制
add device 1: /dev/input/event2

name: "virtual-search"

could not get driver version for /dev/input/js0, Invalid argument

add device 2: /dev/input/event1

name: "rtk_keypad"

add device 3: /dev/input/event0

name: "mtkinp"

/dev/input/event0: 0001 0192 00000001

/dev/input/event0: 0000 0000 00000000

0 人点赞