0

I have a script that expects files as arguments, and for each executes a set of instructions. How should I write it to be able to pipe it to find? In the example below, I haven't used find as such. I assume its output has the same structure as printf "%s\n..." (has it not?)

my-script.sh:

# !/bin/bash

help() { echo "help" echo }

while [[ $# -gt 0 ]] do case $1 in *) echo "$1" shift # past argument ;; esac done

Fine:

$ cat foo; echo; cat bar
foo

bar $ ./my-script.sh foo bar foo bar

But then:

$ printf "%s\n%s\n" "./foo" "./bar" | xargs -n 1 ./my-script.sh
./my-script.sh: 9: ./my-script.sh: [[: not found
./my-script.sh: 9: ./my-script.sh: [[: not found
Erwann
  • 677

1 Answers1

2

Your shebang

# !/bin/bash

is invalid (it just looks like a comment). Whitespace is permitted after the #!, but not between the # and the !.

Because of that, the script run via xargs is being interpreted by /bin/sh - which does not support the [[ ... ]] extended test syntax (originally from ksh).

When you run the script directly from your interactive shell instead of via xargs, it is likely being interpreted by a bash child shell. See Which shell interpreter runs a script with no shebang?

steeldriver
  • 81,074