Bash 在unix中提取文件的ls-l输出的起始字符

Bash 在unix中提取文件的ls-l输出的起始字符,bash,shell,grep,wildcard,Bash,Shell,Grep,Wildcard,以下是文件名: -rwxrwx 1用户1用户268 9月16日18:06脚本 grep第一个字符的命令应该是什么 基于此,我想得出结论,该项是文件、目录还是软链接 我们可以用通配符“^”来获取此信息吗?这是判断某个东西是否是符号链接的错误方法。相反,请使用test原语: for name in *; do if test -L "$name"; then echo "symlink: $name" elif test -f "$name"; then echo "

以下是文件名:

-rwxrwx 1用户1用户268 9月16日18:06脚本

grep第一个字符的命令应该是什么

基于此,我想得出结论,该项是文件、目录还是软链接


我们可以用通配符“^”来获取此信息吗?

这是判断某个东西是否是符号链接的错误方法。相反,请使用
test
原语:

for name in *; do
  if   test -L "$name"; then echo "symlink:           $name"
  elif test -f "$name"; then echo "regular file:      $name"
  elif test -d "$name"; then echo "directory:         $name"
  elif test -b "$name"; then echo "block device:      $name"
  elif test -c "$name"; then echo "character device:  $name"
  elif test -p "$name"; then echo "named pipe (FIFO): $name"
  elif test -S "$name"; then echo "socket:            $name"
  else                       echo "other:             $name"
  fi
done
上述内容也可以写成
[-L“$name”]
[-f“$name”]
等;正如有一个名为
test
的shell内置命令和一个名为
/usr/bin/test
的可执行文件一样,还有一个名为
[
的shell内置命令和一个名为
/usr/bin/[
的可执行文件(除了要求其最后一个参数为
]


回答您的字面问题,而不是解决如何最好地解决您的实际/潜在问题:

在shell中的字符串中包含内容后,可以执行参数扩展以获取第一个字符:

s=abc # or s=$(...some command here...), or so forth
echo "${s:0:1}" # this returns "a"
要获取流的第一个字符(例如来自管道命令的stdout),只需使用
head-c1

echo "abc" | head -c 1 # this also returns "a"; echo can be replaced with any other command

查看
ls-l
输出的第一个字符对于既不是目录、FIFO、符号链接也不是设备的文件来说并不总是
-
,这在很大程度上取决于操作系统的扩展名。POSIX确实指定第一个字符指定“文件类型”,并为几种特定类型指定特定字符,但也明确表示“实现可能会将其他字符添加到此列表以表示其他实现定义的文件类型”。顺便说一句,
^
实际上不是通配符,而通配符与任何字符完全匹配,
^
(在regex中)与零字符匹配因此,您可以使用
^.
来匹配字符串前面的单个字符——在这种情况下,
是正在使用的通配符,
^
限制它匹配的位置——但这里没有太多理由这样做。Right.wrt
^
-s/wildcard/metacharacter/。