Linux Notes
2017.11.27
Shell 中获取用户输入
尽管可以通过命令行选项和参数从脚本用户处获取输入,但有时脚本的交互性还需要更强一些,可以使用 bash shell 提供的 read 命令交互地获取用户输入。
在创建脚本文件时,必须在文件的第一行指定要使用的 shell,比如说我要使用 bash,可以先在终端中使用 which bash
查询 bash 的位置:
/usr/local/bin/bash
然后用这个位置在脚本文件中指定使用的 shell:
#!/usr/local/bin/bash
注意前面的 #!
符号。通常在 shell 脚本中,#
用作注释行,shell 不会处理脚本中的注释行。但是,这里的第一行是个例外,#
后面的感叹号会告知 shell 使用哪个 shell 程序来运行脚本。
指定了 shell 之后,就可以在文件中的每一行输入命令,然后加一个回车符,当然,可以通过 #
添加注释信息:
#!/usr/local/bin/bash
# This script displays the date and who's logged on
echo -n "The time and date are: "
date
echo "Let's see who's logged into the system:"
who
上面就是我们创建的第一个脚本的所有内容了。可以根据需要将两个命令放在同一行,用分号隔开。shell 会按照命令在文件中出现的顺序处理。将这个文件保存在名为 test
的文件中,可以不指定后缀名。
运行脚本文件时需要指定脚本的位置,可以将 shell 文件所处的目录添加到 PATH 环境变量中,也可以在终端中使用绝对或相对文件路径引用脚本文件。例如这里,test 文件就位于当前目录下,可以这样运行它:
./test
-bash: ./test: Permission denied
但是,shell 虽然找到了 test 脚本文件,却提示没有权限执行。
在创建 test 文件时,umask(详见Linux 文件权限)决定了文件的默认权限:
ls -l test
-rw-r--r--@ 1 franklin staff 163 Nov 2 11:14 test
新建的 test 属主仅有读写权限,通过 chmod
增加执行权限(x
)才能运行 test 脚本:
chmod u+x test
ls -l test
-rwxr--r--@ 1 franklin staff 163 Nov 2 11:14 test
OK,现在我们可以运行 test 脚本了:
./test
The time and date are: Thu Nov 2 12:27:35 HKT 2017
Let's see who's logged into the system:
franklin console Nov 2 10:37
franklin ttys000 Nov 2 11:07
示例虽然简单,但不积跬步何以至千里呢,继续下去吧……
Frank Lin
Linux Notes
2017.11.27
尽管可以通过命令行选项和参数从脚本用户处获取输入,但有时脚本的交互性还需要更强一些,可以使用 bash shell 提供的 read 命令交互地获取用户输入。
Tools
2020.12.25
I'm currently using LogDNA for gathering Nginx logs. However, I can only see IPs from Cloudflare by default in the logs as my server was proxied by Cloudflare. Let's see how to reveal the real IP address of the client in the logs behind such reverse proxy server by using ngx_http_realip_module.